2016-05-21 19 views
0

私はcmake + nmakeを使ってexeをビルドしていますが、実行ファイル自体からアイコンハンドルを取得したいと思います。SHGetFileInfoでexeアイコンを取得するのに失敗しました

CMakeLists.txt:

add_executable(test test.cpp test.rc) 

test.rc:

IDI_ICON ICON DISCARDABLE "test.ico" 
IDI_ICON0 ICON DISCARDABLE "test.ico" 
IDI_ICON1 ICON DISCARDABLE "test.ico" 
IDI_ICON2 ICON DISCARDABLE "test.ico" 

TEST.CPP:

#include <windows.h> 
#include <iostream> 
using namespace std; 

int main() { 
    SHFILEINFO sfi; 
    memset(&sfi, 0, sizeof(sfi)); 
    DWORD_PTR ret = ::SHGetFileInfo("g:/workspace/test2/debug/test.exe", 
        0, &sfi, sizeof(sfi), SHGFI_LARGEICON|SHGFI_SMALLICON|SHGFI_ICON); 
    cout << hex; 
    cout << ret << endl; // prints 0 
    cout << sfi.hIcon << endl; // prints 0 
} 

実行G:/ワークスペース/ TEST2 /デバッグ/試験.exeにはアイコンがありますが、SHGetFileInfoがアイコンを取得できませんでした.cの問題オデ?

+0

あなたが特定のアイコンタイプ 'SHGFI_ICONで' uFlags'パラメータを組み合わせてみました| SHGFI_LARGEICON'または 'SHGFI_ICON | SHGFI_SMALLICON'?また、 'SHGetFileInfo()'の戻り値をチェックして、何が起きているのか把握する必要があります。 – Cyclonecode

+0

これらのパラメータと戻り値で更新されたオリジンポスト。 – aj3423

+0

と戻り値は何ですか? – Cyclonecode

答えて

1

Jonathan Potterのコメント投稿は、バックスラッシュの原因です。コードは、ファイルパスの '/'を '/'に変更した後に動作します。

1

私のベスト・ベットは、アイコン情報の抽出を試みる前にCoInitialize()に電話する必要があることです(documentation)。我々は前方に扱うことができないWindowsの機能を持っている場合、私は驚かないだろうスラッシュ:

をあなたは前にSHGetFileInfoを呼び出すのCoInitializeまたはOleInitializeを持つコンポーネントオブジェクトモデル(COM)を初期化する必要があります。だから、コードコードはのようなものに変更することが

int main() { 
    SHFILEINFO sfi; 

    // initialize COM library 
    CoInitialize(NULL); 
    memset(&sfi, 0, sizeof(sfi)); 
    DWORD_PTR ret = ::SHGetFileInfo("g:/workspace/test2/debug/test.exe", 
       0, &sfi, sizeof(sfi), SHGFI_LARGEICON | SHGFI_ICON); 
    cout << hex; 
    cout << ret << endl; // prints 0 
    cout << sfi.hIcon << endl; // prints 0 

    CoUninitialize(); 
} 
+0

Windows上のパス区切り文字はバックスラッシュ( "\")です。 Windows APIの* "ファイルI/O関数は、名前をNTスタイルの名前" *([ファイルの名前、パス、名前空間](https://)に変換する際に、 "/"を "\" msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx))、パスに "\\?\"というプレフィックスがある場合、この変換は行われません。ちなみに、この接頭辞は、ファイルI/O関数のパス名の制限を32k Unicode文字にプッシュします。 'SHGetFileInfo'はファイルI/O関数の一部ではないので、変換は契約上のものではありません。 – IInspectable

関連する問題