2009-05-13 5 views
0

Ich habe ein Problem mit SHGetFileInfo auf dem öffentlichen Desktop und Dateien auf dem öffentlichen Desktop. Ich konzentriere mich auf den eigentlichen Desktop-Ordner (CSIDL_COMMON_DESKTOPDIRECTORY oder normalerweise "C: \ Users \ Public \ Desktop"). Außerdem - ich habe dieses Verhalten erst seit kurzem gesehen, aber ich kann die genaue Änderung, die es fehlerhaft gemacht hat, nicht genau bestimmen. Der eigentliche Aufruf von ShGetFileInfo hat sich nicht geändert (soweit ich das beurteilen kann).SHGetFileInfo auf dem öffentlichen Desktop

So habe ich diese (I Zwischenfehlerprüfungen weggelassen habe zu verkürzen - die Funktionsaufrufe Rückkehr mit Erfolg):

SHFILEINFOW info; 
uint32_t return_value = 0; 
uint32_t flags = SHGFI_TYPENAME|SHGFI_ICON|SHGFI_SMALLICON|SHGFI_SYSICONINDEX; 
uint32_t attributes = FILE_ATTRIBUTE_NORMAL; 
wchar_t *path = L"C:\\Users\\Public\\Desktop"; 
return_value = SHGetFileInfoW(path, attributes, &info, sizeof(SHFILEINFOW), flags); 

printf("[%ls] %u ", path, return_value); 

Diese liefert 0 als Rückgabewert. Wenn ich Pfad mit:

SHGetFolderPathW(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, 0, path) 

gebe, bekomme ich das gleiche Ergebnis. Aber wenn ich die PIDL verwenden, wie:

LPITEMIDLIST pidl = NULL; 
SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, &pidl); 
return_value = SHGetFileInfoW((LPCWSTR) pidl, attributes, &info, sizeof(SHFILEINFOW), flags | SHGFI_PIDL); 

Dann bekomme ich etwas, was ich erwarte, einen Griff an das System kleine Symbol-Liste.

Ich kann nicht sagen, was ich falsch mache - und es passiert nur in diesem spezifischen Ordner. Ich brauche eigentlich Icons für die Elemente innerhalb des Verzeichnisses, daher scheint die Verwendung des Pidl momentan keine Option zu sein. Irgendwelche Ideen, wie man Icons vom gemeinsamen Desktop abfragen kann?

-

Ich sollte dieses Verhalten geschieht auf Windows Vista erwähnen - den Weg von SHGetFolderPathW auf XP bestückt mit adaequat

+0

Versuchen Sie, den Weg mit einem ‚\‘ am Ende so SHGetFileInfo() weiß sicher anhängt, dass es ein Ordnerpfad ist und kein Dateipfad. –

+0

Sie können PIDLs mit Dateien verwenden, BTW. Rufen Sie SHGetDesktopFolder() auf, um die oberste IShellFolder-Schnittstelle für die Shell abzurufen, übergeben Sie dann die PIDL von SHGetSpecialFolderLocation() an ihre BindToObject() -Methode, um eine IShellFolder-Schnittstelle für den Ordner abzurufen, und rufen Sie dann deren EnumObjects() -Methode auf Schnittstelle, die Ihnen die relativen PIDLs der Dateien und Unterordner gibt. Sie müssen sie nur in absolute PIDLs konvertieren, wenn Sie sie an SHGetFileInfo() übergeben, das ist alles. –

Antwort

1

hatte ich das gleiche Problem. Es kann behoben werden, indem beim Start des Programms die Funktion CoInitialize von OLE32.DLL aufruft.

CoInitialize(0); 
return_value = SHGetFileInfoW(path, attributes, &info, sizeof(SHFILEINFOW), flags);