0

FOLDERID_ControlPanelFolder を照会すると、GetPath が常に 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();

(はい、私はこの質問に出くわしましたが、すべての列挙は必要ありません。)

4

2 に答える 2

1

パスが必要だった理由は、ShellExecute を "open" してコントロール パネルを開きたかったからです。コントロール パネル プログラムを直接実行すると、目的のアプレット (この場合は「サウンド」) をすぐに選択できるという利点があります。これを回答として投稿するのが大げさではないことを願っています:

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);
    }
}
于 2013-06-25T14:03:17.867 に答える