テスト中のプロセスでページ ヒープを有効にすると、SHGetFileInfo が呼び出されたときにヒープの破損が発生したことを示すアクセス違反がトリガーされます。
コール スタックの一番上には msvcr90!wcspbrk が表示され、さらに下に進むと、SHGetFileInfo を呼び出す shell32 に到達するまで、ole32 内の COM 関連のアイテムが表示されます。
私がオンラインで見つけたものによると、shell32 を使用した奇妙さの一般的な問題は、最初に CoInitialize/CoInitializeEx を呼び出さないことですが、この時点で CoInitializeEx() は既に呼び出されており、以下のコードの直前に呼び出すと S_FALSE が返されます。
以下のコードは、.NET から PInvoked された DLL 内にあります (コードは、特定のファイルに使用されるアイコンを取得するために使用されます)。
SHFILEINFOW shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfoW(A2W("C:\\logfile.txt"),
FILE_ATTRIBUTE_NORMAL,
&shfi,
sizeof(shfi),
SHGFI_USEFILEATTRIBUTES
| SHGFI_ICON
);
(ここで、logfile.txt はルート ドライブ上のランダム テキスト ファイルです)
簡単にするために、最初のパラメーターをマシン上のファイルにハードコードしました。
64 ビット Windows OS を使用していますが、コードは 32 ビット コンテキストで実行されます。SHGetFileInfo のナロー バージョンを使用すると、同じ結果が得られます。
プロセスのページ ヒープを無効にしても問題はありません。
フラグ SHGFI_ICON を使用しない場合、問題は発生しません。
編集: @HansPassant は、再現可能なサンプルを追加するよう要求しました。これは、問題を示す Visual Studio 2010 Win32 コンソール アプリケーションへのリンクです:サンプル