2016-11-14 6 views
0

셸 폴더가 제어판 항목입니다. 같은 ITEMIDLIST를 얻으려고합니다. 쉘 폴더 GUID가 있습니다.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

가, 내가 노력 문서로가는

::{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. 

답변

1

파트로 HRES를 얻을 수 (이것은 델파이하지만 기본 원칙은 볼 수) :

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)를 전달하면 작동하지 않습니다. – Peaked

+0

그리고 ParseDisplayName의 HRESULT는 무엇입니까? 코드를 보여 주면 더 나아질 것입니다. –

+0

hres is E_INVALIDARG 하나 이상의 인수가 유효하지 않습니다. 표시 이름을 :: {GUID}로 전달합니다. – Peaked