Вопрос по c++, mfc, guid, shell, clsid – C ++ MFC создает IShellItem из CLSID (GUID)

0

Я должен создать ShellItem для справки Windows и Windows Run ...

у меня есть это

Help and Support    {2559a1f1-21d7-11d4-bdaf-00c04f60b9f0}
Run {2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}

отhttp://www.sevenforums.com/tutorials/110919-clsid-key-list-windows-7-a.html

Я пытался

IShellFolder* desk = NULL;
HRESULT hr =SHGetDesktopFolder(&desk);
LPITEMIDLIST pidl2=NULL;
            ULONG cbEaten;
            DWORD dwAttribs = 0 ;

            hr = desk->ParseDisplayName(NULL,
                                         NULL,
                                         L"::{2559A1F1-21D7-11D4-BDAF-00C04F60B9F0}",
                                     &cbEaten,  // This can be NULL
                                         &pidl2,
                                         &dwAttribs);

Он возвращает ОК, но Null как pidl2

не могли бы вы, ребята, помочь мне?

Ваш Ответ

1   ответ
2

если вы передадите «shell ::: {2559a1f3-21d7-11d4-bdaf-00c04f60b9f0} & quot; но я думаю, это не совсем то, что вы хотите.

ParseDisplayName может анализировать некоторые пути :: {clsid}, но я думаю, что он ограничен очень ограниченным набором специальных папок CSIDL_ *. SHSimpleIDListFromPath смог его проанализировать.

Если вы действительно хотите разобрать его с ParseDisplayName, вы можете попробовать эмулировать 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();
}
Я имел в виду, что использование shell: префикс в некотором смысле является неудовлетворительным решением, так как проводник может анализировать без него ...
& quot; ParseDisplayName должен иметь возможность его анализировать, если вы передадите & quot; shell ::: {2559a1f3-21d7-11d4-bdaf-00c04f60b9f0} & quot; но я думаю, это не совсем то, что вы хотите. & quot; На самом деле это именно то, что я хотел! оболочка L "::: {2559A1F1-21D7-11D4-BDAF-00C04F60B9F0}"; решил мою проблему! поблагодарить! Carlos_rpg

Похожие вопросы