2016-05-21 4 views
0

Ich benutze cmake + nmake, um exe zu erstellen, ich möchte das Icon-Handle von der ausführbaren Datei selbst erhalten.Fehler beim Abrufen des EXE-Symbols mit SHGetFileInfo

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 
} 

Die ausführbare g:/Arbeitsplatz/test2/debug/Test .exe hat Symbol, aber die SHGetFileInfo konnte das Symbol nicht abrufen, was mit der c falsch ist Ode?

+0

Haben Sie den 'uFlags' Parameter mit einem bestimmten Symbol Typ' SHGFI_ICON zu kombinieren versucht | SHGFI_LARGEICON' oder 'SHGFI_ICON | SHGFI_SMALLICON'? Sie sollten auch den Rückgabewert von 'SHGetFileInfo()' überprüfen, um herauszufinden, was vor sich geht. – Cyclonecode

+0

Herkunft Post aktualisiert mit diesen Parametern und Rückgabewert. – aj3423

+0

und was ist der Rückgabewert? – Cyclonecode

Antwort

1

Als Kommentar Beitrag von Jonathan Potter, wird es durch den Back-Schrägstrich verursacht. Der Code funktioniert nach dem Ändern von '/' in '\' im Dateipfad.

1

Meine beste Wette wäre, dass Sie (documentation) CoInitialize() aufrufen müssen, bevor Sie versuchen, die Symbolinformationen zu extrahieren. Und wenn wir eine Windows-Funktion, die nach vorne nicht umgehen kann schlitzt Ich würde nicht überrascht sein:

Sie müssen Component Object Model (COM) mit CoInitialize oder OleInitialize vor initialisieren SHGetFileInfo zu rufen.

So kann der Code Code ähnlich wie folgt geändert:

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

Das Pfadtrennzeichen unter Windows ist ein umgekehrter Schrägstrich ("\"). Während die Funktionen der * I/O-Datei in der Windows-API "/" in "" als Teil der Umwandlung des Namens in einen NT-Namen umwandeln "* ([Benennen von Dateien, Pfaden und Namespaces]) (https: // msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx)), wird diese Konvertierung nicht ausgeführt, wenn Pfade ein "\\" Präfix haben. Übrigens drückt dieses Präfix den Pfadnamen auf 32.000 Unicode-Zeichen für die Datei-E/A-Funktionen. Da 'SHGetFileInfo' nicht Teil der Datei-E/A-Funktionen ist, ist die Konvertierung nicht vertraglich. – IInspectable

Verwandte Themen