2017-03-08 54 views
0

我在Windows 10專業版和Visual Studio 2013,和我使用SHGetFileInfoW以獲取文件類型的圖標位置(路徑+指數):我不能得到的SHGetFileInfo返回的圖標位置

std::wstring wFile { L"a.bas" }; 
SHFILEINFOW fi {};  
DWORD success = ::SHGetFileInfoW(wFile.c_str(), 
           FILE_ATTRIBUTE_NORMAL, 
           &fi, 
           sizeof(fi), 
           SHGFI_USEFILEATTRIBUTES | SHGFI_ICONLOCATION); 

無論wFile是指現有文件還是隻是任何文件名,呼叫都會返回表示成功。 fiiIcon成員被設置爲一個數字,但szDisplayString爲空。不只是驅動器號被\0覆蓋(好像發生在here),但它完全充滿了\0

微軟建議使用IExtractIcon::GetIconLocation作爲替代,但我需要獲得哪些不是在本地文件系統中的文件的圖標,所以我不能讓一個IShellInfo對象,它會得到我這個接口指針。

另一方面,獲取圖標手柄起作用。這個功能只是越野車,或者我做錯了什麼?有沒有解決方法?

+0

將''a.bas''改成''bas''(或''.bas''')。 [SHGetFileInfo函數](https://msdn.microsoft.com/en-us/library/windows/desktop/bb762179(v = vs.85).aspx)「...只是擴展...」。還要注意圖標不一定有位置(路徑),所以我不確定你可以使用'SHGFI_ICONLOCATION'。 –

+0

@¡''bas'甚至不會返回索引,'.bas'就像'a.bas'一樣工作並返回索引,但不返回路徑。這裏的文檔似乎很sl。。 –

+0

我現在沒有時間來嘗試這個了,但考慮到您的意見,「獲取圖標手柄的作品」我認爲問題是,圖標不必是固定的路徑,因爲它們可以動態生成圖標處理器。 –

回答

3

圖標可以動態生成,並且可能不會暴露其圖像的路徑。圖標處理程序通過在IExtractIcon::GetIconLocation實現中設置GIL_NOTFILENAME標誌將此信息傳遞給shell。如果設置了GIL_SIMULATEDOC,那麼shell一般也必須在運行中生成一個圖標。

如果您調用SHGetFileInfo且設置了SHGFI_SELECTED標誌,那麼無論您要求哪種文件類型,函數可能都必須生成一個新圖標。

如果您在ListView/TreeView中顯示文件列表,則通常使用SHGFI_SYSICONINDEX|SHGFI_SHELLICONSIZE|SHGFI_SMALLICON並使用系統映像列表。

如果您需要HICON,請使用SHGFI_ICON

如果指定SHGFI_ICONLOCATION然後SHGetFileInfo使用IExtractIcon:

檢索包含代表由pszPath指定的文件的圖標文件的名稱,通過該文件的圖標處理程序的IExtractIcon :: GetIconLocation方法返回。

相關問題