【问题标题】:Getting the Windows Control Panel's virtual folder获取 Windows 控制面板的虚拟文件夹
【发布时间】:2013-06-24 15:02:41
【问题描述】:

为什么 GetPath 在查询 FOLDERID_ControlPanelFolder 时总是返回 E_FAIL?其他 FOLDERID 确实有效:

HRESULT hr = S_OK;
*path = '\0';
LPWSTR pwcPath = NULL;

CoInitialize(NULL);

IKnownFolderManager *pFolderManager = NULL;
if ((hr = CoCreateInstance(__uuidof(KnownFolderManager), NULL, CLSCTX_INPROC_SERVER, __uuidof(IKnownFolderManager), (LPVOID *)&pFolderManager)) == S_OK)
{
    IKnownFolder *pControlPanelFolder = NULL;
    if ((hr = pFolderManager->GetFolder(FOLDERID_ControlPanelFolder, &pControlPanelFolder)) == S_OK)
    {
        hr = pControlPanelFolder->GetPath(0, &pwcPath);

        if (hr == S_OK && pwcPath)
        {
            int nSize = wcslen(pwcPath);
            WideCharToMultiByte(CP_ACP, 0, pwcPath, nSize, path, nSize+2, NULL, NULL);
            path[nSize] = '\0';
            CoTaskMemFree(pwcPath);
        }

        pControlPanelFolder->Release();
        pControlPanelFolder = NULL;
    }

    pFolderManager->Release();
    pFolderManager = NULL;
}

CoUninitialize();

(是的,我偶然发现了this question,但我不需要所有枚举的东西。)

【问题讨论】:

  • 可能是因为控制面板是一个虚拟文件夹,因此它没有实际路径?
  • Getting PIDL of Control Panel: string ControlPanelGUID = "::{26EE0668-A00A-44D7-9371-BEB064C98683}";

标签: winapi com


【解决方案1】:

控制面板没有目录路径,因为它在光盘上不存在。您可以获得它的 PIDL,甚至是桌面绝对解析“显示名称”(通过 GetShellItem 和 GetDisplayName),但不能获得目录路径。

【讨论】:

    【解决方案2】:

    我需要路径的原因是我想用 ShellExecute “打开”来打开控制面板。我现在直接执行控制面板程序,好处是能够立即选择所需的小程序(在本例中为“声音”)。我希望我将其发布为答案不会太自命不凡:

    char controlpanelpath[2000];
    UINT controlpanelpathbuffersize = sizeof(controlpanelpath);
    int actualcontrolpanelpathsize;
    if (actualcontrolpanelpathsize = GetSystemDirectory(controlpanelpath, controlpanelpathbuffersize))
    {
        char *parameters = "\\control.exe mmsys.cpl,,0";
        if (actualcontrolpanelpathsize + strlen(parameters) < controlpanelpathbuffersize)
        {
            strcat(controlpanelpath, parameters);
            WinExec(controlpanelpath, SW_NORMAL);
        }
    }
    

    【讨论】:

    • WinExec 有点老派,如果你使用 ShellExecute 你可以直接通过mmsys.cpl
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2013-10-22
    • 2010-10-26
    • 2018-11-29
    • 2011-12-03
    相关资源
    最近更新 更多