IShellFolder :: ParseDisplayName获取控制面板的ITEMIDLIST项目
问题描述:
我有一个控制面板项目的外壳文件夹。我正在尝试获取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.
答
部分我工作项目(这是德尔福,但主要原理是可见):
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;
试过,但ControlPanelFolder-> ParseDisplayName没有按”当我传递_T(:: GUID)作为显示名时,t工作。 – Peaked
什么是ParseDisplayName的HRESULT?如果你显示你的代码会更好。 –
hres是E_INVALIDARG一个或多个参数无效。 我将显示名称作为:: {GUID} – Peaked