C++ MFC create IShellItem from CLSID (GUID)

拜拜、爱过 提交于 2019-12-01 14:40:46

ParseDisplayName should be able to parse it if you pass "shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}" but I guess that is not really what you want.

ParseDisplayName is able to parse some ::{clsid} paths but I think it is restricted to a very limited set of CSIDL_* special folders. SHSimpleIDListFromPath was able to parse it.

If you really want to parse it with ParseDisplayName you can try to emulate SHSimpleIDListFromPath:

class EmptyFileSystemBindData : public IFileSystemBindData {
public:
    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
    {
        if (riid == IID_IUnknown || riid == IID_IFileSystemBindData) {
            *ppv = static_cast<IUnknown*>(this);
            AddRef();
            return S_OK;
        }
        *ppv = NULL; return E_NOINTERFACE;
    }
    STDMETHODIMP_(ULONG) AddRef() { return 2; }
    STDMETHODIMP_(ULONG) Release() { return 1; }
    STDMETHODIMP SetFindData(const WIN32_FIND_DATAW *pfd) 
    {
        return S_OK;
    }
    STDMETHODIMP GetFindData(WIN32_FIND_DATAW *pfd)
    {
        ZeroMemory(pfd,sizeof(WIN32_FIND_DATAW));
        return S_OK;
    }
};

LPITEMIDLIST pidl2=NULL;
HRESULT hr;
IShellFolder*psf;
IBindCtx*pbc;
hr = CreateBindCtx(0,&pbc);
EmptyFileSystemBindData efsbd;
if (SUCCEEDED(hr))
{
    BIND_OPTS bo = {sizeof(bo)};
    bo.grfMode = STGM_CREATE;
    hr = pbc->RegisterObjectParam(STR_FILE_SYS_BIND_DATA,&efsbd);
    if (SUCCEEDED(hr) && 0==pbc->SetBindOptions(&bo))
    {
        hr = SHGetDesktopFolder(&psf);
        if (SUCCEEDED(hr))
        {
            hr = psf->ParseDisplayName(0,pbc,L"::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}",0,&pidl2,0);
            if (SUCCEEDED(hr))
            {
                OutputDebugStringA("parsed ok\n");
                ILFree(pidl2);
            }
            psf->Release();
        }
    }
    pbc->Release();
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!