2012-05-14 70 views
0

我要創建一個ShellItem Windows幫助和Windows運行...C++ MFC從CLSID創建的IShellItem(GUID)

我有這個

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); 

它返回OK,但Null作爲pidl2

可你們給我一些幫助嗎?

回答

2

如果您通過「shell ::: {2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}」,ParseDisplayName應該能夠解析它,但我想這不是你想要的。

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(); 
} 
+0

「ParseDisplayName應該能夠解析它,如果你通過」殼::: {2559a1f3-21d7-11d4-BDAF -00c04f60b9f0}「但我想這不是你想要的。」實際上,這正是我想要的!在L 「殼::: {2559A1F1-21D7-11D4-BDAF-00C04F60B9F0}」 解決我的問題!謝謝! –

+0

我的意思是,使用shell:前綴是在某些方面是不令人滿意的解決方案,因爲資源管理器就不需要了解析... – Anders