【问题标题】:IShellFolder::ParseDisplayName to get ITEMIDLIST for Control Panel ItemIShellFolder::ParseDisplayName 获取控制面板项的 ITEMIDLIST
【发布时间】:2016-11-14 14:42:58
【问题描述】:

我有 Shell 文件夹,它是一个控制面板项。我正在尝试获取相同的 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.

【问题讨论】:

    标签: c++ windows-shell shell-extensions


    【解决方案1】:

    我的工作项目的一部分(它是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;
    

    【讨论】:

    • 试过了,但是当我将 _T(::GUID) 作为显示名称传递时,ControlPanelFolder->ParseDisplayName 不起作用。
    • ParseDisplayName 的 HRESULT 是什么?如果您显示您的代码会更好。
    • hres 为 E_INVALIDARG 一个或多个参数无效。我将显示名称传递为 ::{GUID}
    • 整个代码呢? (您可以编辑您的初始问题)。 NSE 位数(32/64/两者)?你的代码位数?
    • 如果您在 Win64 上运行 32 位代码,您还必须在 HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\explorer\ControlPanel\NameSpace 中注册您的项目。
    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多