2011-11-27 80 views
0

我一直在研究如何實現名稱空間擴展。如何在Shell命名空間擴展中使用默認的文件夾視圖?

的NSE應顯示文件和文件夾(它們是物理文件和文件夾,但所在的磁盤上的其他地方)。

此外,NSE必須的行爲儘可能接近正常的資源管理器視圖,例如,它必須有:

通常會出現在,都適用於選擇
  • 拖放(這兩個文件/文件夾等之類的東西文獻的文件/文件夾(S)正常Explorer視圖
    • 上下文菜單廢料)
    • 「右鍵拖放」(如7Zips「提取這裏...」)
    • 剪貼板複製/剪切/粘貼
    • 分享條目
    • 任何註冊殼牌圖標疊加處理程序必須工作(如烏龜SVN/GIT)
    • 列寬/重新排序
    • 查看自定義,包括排序和分組

    所以,基本上什麼Explorer視圖可以這樣做,我們必須。

    縱觀資源管理器可以做的所有事情(以前我認爲理所當然),我感覺有點不知所措。我的計劃是在我的NSE中重用資源管理器視圖的功能。因爲我既懶惰又真實(我意識到幾乎不可能複製所有這些功能沒有問題),我的計劃是重用我的NSE中資源管理器視圖的功能。

    我看了各種樣本的NSEs。其中大多數使用虛擬數據,但正如我所說,我代表磁盤上其他地方的物理文件和文件夾。我也讀了關於SHCreateShellFolderView方法。

    有了這些信息,我想這會是我提供的根文件夾的PIDL,然後在我的IShellFolder::CreateViewObject通話SHCreateShellFolder方法的相對簡單的情況。這是該方法:

    STDMETHODIMP CShellFolderImpl::CreateViewObject( 
        HWND hwndOwner, 
        REFIID riid, 
        void** ppvOut) 
    { 
        HRESULT hr=E_NOINTERFACE; 
    
        if (NULL == ppvOut) 
         return E_POINTER; 
    
        *ppvOut = NULL; 
    
        if (riid == IID_IShellView) 
        { 
         SFV_CREATE SfvCreate = 
         { 
          sizeof(SFV_CREATE) 
         }; 
    
    
         if (SUCCEEDED(hr = QueryInterface(IID_PPV_ARGS(&SfvCreate.pshf)))) 
         { 
          hr = ::SHCreateShellFolderView(
           &SfvCreate, 
           reinterpret_cast<IShellView **>(ppvOut)); 
         } 
    
         SfvCreate.pshf->Release(); 
        } 
        else if (riid == IID_ITransferSource) 
        { 
    
        } 
    
        return hr; 
    } 
    

    沒有這樣的運氣。 SHCreateShellFolderView總是返回E_NOTIMPL。原來,這是因爲它需要一個指向IShellFolder2(和IPersist2GetCurFolder,我可以提供我的PIDL)的指針。我的文件夾剛剛實施了IShellFolderIPerist

    所以在改變這些實現更新的接口後,我得到了......什麼都沒有! NSE將由Explorer加載,構造函數將被調用,但緊接着,析構函數會被調用。如果我將界面改回原來的狀態,它就會啓動(但仍然存在同樣的問題)。

    我一直在尋找一個樣本,它實現了IShellFolder2,但是文檔和其餘的這些API一樣糟糕。

    我該如何使用SHCreateShellFolderView以便我不必重新實現瀏覽器已經做的所有事情?

  • 回答

    2

    即使您能夠爲您的名稱空間擴展使用並嵌入Windows資源管理器窗口,問題是您不再控制它的功能。例如,如果用戶雙擊某個文件夾,將瀏覽實際的文件系統文件夾,而不是代表文件系統文件夾的名稱空間擴展節點。

    你唯一的選擇是做你自己的實現。查看EZNamespaceExtensionsMFC,這使得開發命名空間擴展變得非常容易。它有一個「FileSystemBrowser」示例,您可以將其用作起點。

    免責聲明:我爲LogicNP,EZNamespaceExtensionsMFC的開發人員工作。

    相關問題