IShellFolder :: ParseDisplayName, чтобы получить ITEMIDLIST для элемента панели управления

У меня есть папка оболочки, которая является элементом панели управления. Я пытаюсь получить список тем же. У меня есть GUID папки скорлупы.

Исходя из документации

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);
}

Я получаю как

E_INVALIDARG One or more arguments are invalid.

0

Решение

Часть моего рабочего проекта (это Delphi, но основной принцип виден):

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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector