none
Win32API : ExtractAssociatedIcon RRS feed

  • 質問

  • Win32APIのExtractAssociatedIconを使うと、指定したファイルまたはそのファイルに関連付けられた実行ファイルからアイコンを抽出してハンドルを取得することができます。

    で、MSDNライブラリの説明では、2番目のパラメータ(ipIconPath)は、

    指定したファイルではなく、指定したファイルに関連付けられている実行可能ファイルからアイコンのハンドルを取得した場合、この関数から制御が返ると、lpIconPath パラメータが指すメモリに、その実行可能ファイルのフルパスとファイル名が格納されます。

    となっているので、抽出されたアイコンが、そのファイルが持っているものか、関連付けられた別の実行ファイルが持っているものかは、呼び出し前と呼出し後のlpIconPathが指すバッファの内容を比較すれば判別できそうです。

    ところが実際にやってみると、指定したファイルの拡張子が ".txt" や ".doc" の場合でも、".exe" の場合でも、lpIconPathが指すバッファイの内容には呼び出しの前後で変化がありません。

    私が試している環境は、VS2005、MFCアプリケーションです。実行環境はWin2Kです。Vistaでも同じ結果でした。

    これは、MSDNライブラリの記載が間違っているのでしょうか?

    2007年2月16日 8:59

すべての返信

  • 次のような(いい加減な)コードを書いてみました。aho.txt は指定されている場所に存在しているとします。hInstance に何も与えてないので、まずいかと思ったのですが…

    #include "stdafx.h"
    #include <windows.h>
    #include <Shellapi.h>


    int _tmain(int argc, _TCHAR* argv[])
    {
     TCHAR buf [512] ;
     WORD dw ;

     lstrcpy (buf, TEXT ("\\TMP\\aho.txt")) ;
     ExtractAssociatedIcon  (NULL, buf, &dw) ;
     _tprintf (TEXT ("%s\n"), buf) ;
     return 0;
    }

    結果、C:\WINDOWS\system32\SHELL32.dll と表示されます。

    Visual Studio 2005 で build して WindowsXP SP2 及び Windows2000SP4 の両方で同じように動作しています。

     

    2007年2月16日 10:38
  • テストしていただき、ありがとうございました。

    確かに、示していただいたコードだと buf が C:\…(略)…\SHELL32.dll に書き換わるようです。

    ところが、

    lstrcpy (buf, TEXT ("\\TMP\\aho.txt"));

    の部分を、

    lstrcpy (buf, TEXT ("C:\\TMP\\aho.txt")) ;

    とすると、やはり buf が書き換わりません。

    それに、"\\TMP\\aho.txt" のケースでは、ExtractAssociatedIconの戻り値のアイコンハンドルを表示してみると、メモ帳などの .txt 用のアイコンではなく、関連付けされていないファイル(拡張子がないファイルとか)用のアイコンが表示されます。

    一方、"C:\\TMP\\aho.txt" のケースでは、ちゃんとメモ帳などの .txt 用のアイコンが表示されます。

    指定したファイル自身がアイコンを持っていなくて、関連付けられた別の実行ファイル等からアイコンを抽出した場合にファイル名が書き替えられる、というのが私の思い違いなんでしょうか。

    2007年2月16日 11:32
  •  CTW2007 さんからの引用

    それに、"\\TMP\\aho.txt" のケースでは、ExtractAssociatedIconの戻り値のアイコンハンドルを表示してみると、メモ帳などの .txt 用のアイコンではなく、関連付けされていないファイル(拡張子がないファイルとか)用のアイコンが表示されます。

     返される Icon Handle を確認していませんでした。確かにこれは何の対応付けもされてない場合のアイコンですね…。

    …ExtractAssociatedIconEx を利用すると、notepad.exe は取れるようです。ただ今度は返される icon が notepad の icon になってしまいますが…。

     

    2007年2月16日 12:20