我一直在研究如何實現名稱空間擴展。如何在Shell命名空間擴展中使用默認的文件夾視圖?
的NSE應顯示文件和文件夾(它們是物理文件和文件夾,但所在的磁盤上的其他地方)。
此外,NSE必須的行爲儘可能接近正常的資源管理器視圖,例如,它必須有:
通常會出現在,都適用於選擇- 上下文菜單廢料)
- 「右鍵拖放」(如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
(和IPersist2
GetCurFolder
,我可以提供我的PIDL
)的指針。我的文件夾剛剛實施了IShellFolder
和IPerist
。
所以在改變這些實現更新的接口後,我得到了......什麼都沒有! NSE將由Explorer加載,構造函數將被調用,但緊接着,析構函數會被調用。如果我將界面改回原來的狀態,它就會啓動(但仍然存在同樣的問題)。
我一直在尋找一個樣本,它實現了IShellFolder2
,但是文檔和其餘的這些API一樣糟糕。
我該如何使用SHCreateShellFolderView
以便我不必重新實現瀏覽器已經做的所有事情?