2016-11-14 146 views
0

我有一個控制面板項目的外殼文件夾。我正在嘗試獲取ITEMIDLIST。我有殼牌文件夾GUID。IShellFolder :: ParseDisplayName獲取控制面板的ITEMIDLIST項目

由文檔

https://msdn.microsoft.com/en-us/library/windows/desktop/bb775090%28v=vs.85%29.aspx

https://msdn.microsoft.com/en-us/LIBRary/ms909875.aspx,這並不一致

,我也可以在導航::桌面文件夾{GUID}語法指定顯示名稱的狀態,我試圖去

::{CLSID for Control Panel}\::{CLSID for my Shell folder}. 

但是這不起作用,因爲我最終與控制小組的ITEMIDLIST。如何將ITEMIDLIST獲取到控制面板項目?

隨着@Denis Anisimov建議的答案,我仍然面臨着ParseDisplayName的問題。

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
{ 
HRESULT hres; 
LPSHELLFOLDER cPanel; 
LPSHELLFOLDER DesktopFolder; 
LPITEMIDLIST cpItemPidl; 
LPITEMIDLIST pidl; 
SHGetDesktopFolder(&DesktopFolder); 
SHGetKnownFolderIDList(FOLDERID_ControlPanelFolder, CSIDL_CONTROLS, NULL, &pidl); 
hres = DesktopFolder->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&cPanel); 
LPWSTR SFOLDERGUID = L"::{025A5937-A6BE-4686-A844-36FE4BEC8B6D}"; 

hres = cPanel->ParseDisplayName(NULL, NULL, SFOLDERGUID, NULL, &cpItemPidl, NULL); 
} 

我得到HRES作爲

E_INVALIDARG One or more arguments are invalid. 

回答

1

部分我工作項目(這是德爾福,但主要原理是可見):

function CreatePluginsPIDL: PItemIDList; 
var 
    ControlPanelPIDL: PItemIDList; 
    PluginsParsingName: UnicodeString; 
    Desktop: IShellFolder; 
    ControlPanelFolder: IShellFolder; 
    Eaten: DWORD; 
    Attr: DWORD; 
    Child: PItemIDList; 
begin 
    ControlPanelPIDL := GetKnownFolderIDList(FOLDERID_ControlPanelFolder, CSIDL_CONTROLS); 
    try 
    OleCheck(SHGetDesktopFolder(Desktop)); 
    try 
     OleCheck(Desktop.BindToObject(ControlPanelPIDL, nil, IShellFolder, ControlPanelFolder)); 
     try 
     PluginsParsingName := '::' + GUIDToString(TTC4ShellCPNamespaceCLSID); 
     Attr := 0; 
     OleCheck(ControlPanelFolder.ParseDisplayName(0, nil, PWideChar(PluginsParsingName), Eaten, Child, Attr)); 
     try 
      Result := ILCombine_(ControlPanelPIDL, Child); 
     finally 
      CoTaskMemFree(Child); 
     end; 
     finally 
     ControlPanelFolder := nil; 
     end; 
    finally 
     Desktop := nil; 
    end; 
    finally 
    CoTaskMemFree(ControlPanelPIDL); 
    end; 
end; 
+0

試過,但ControlPanelFolder-> ParseDisplayName沒有按」當我傳遞_T(:: GUID)作爲顯示名時,t工作。 – Peaked

+0

什麼是ParseDisplayName的HRESULT?如果你顯示你的代碼會更好。 –

+0

hres是E_INVALIDARG一個或多個參數無效。 我將顯示名稱作爲:: {GUID} – Peaked