在 Windows 7 上,我开发了一个 shell 命名空间扩展 (NSE),它呈现了与文件系统非常相似的数据层次结构。它的连接点是桌面。我可以单击 Windows 资源管理器的树控件中每个节点的 [+] 以展开该节点。当我单击树视图中的文件夹时,我在DefView呈现的视图中看到了“文件夹”和“文件”列表,正如预期的那样。如果我双击“文件”,DefView 会尽职尽责地调用我相应的 IShellFolder::CreateViewObject来请求IContextMenu,然后最终调用IContextMenu::InvokeCommand,此时我使用lpClass执行ShellExecuteEx设置为“文件”的扩展名。然后,资源管理器根据“文件”扩展名尽职尽责地启动适当的 EXE 应用程序,并将我奇怪的“文件”路径作为命令行参数提供。但是,如果我在 DefView 中双击我的“文件夹”之一,资源管理器将拒绝浏览该文件夹。对调用堆栈的分析表明,Explorer 正在尝试对我奇怪的“文件”路径进行某种类型的区域检查。我试着摆弄控制面板-> Internet 选项-> 安全区域,通过将我奇怪的“文件”路径添加到各个区域,但这不起作用。我可以从调用堆栈中看到有两个区域检查:主要和次要。我想我可以蛮力解决这个问题,但我想知道通过这些区域检查的认可方式,或者更确切地说,让 Explorer 浏览我的“文件夹”。奇怪的是,IFileDialog没有这个问题,并且毫不犹豫地浏览到我的“文件夹”。我还尝试将以下代码添加到我的IShellFolderView::MessageSFVCB:
switch (uMsg)
{
case SFVM_GETZONE:
{
DWORD zone = URLZONE_TRUSTED;
* ((DWORD *)lParam) = zone;
}
return S_OK;
...
那没有帮助。
我也有一种强烈的感觉,因为同样的根本原因,我的拖放操作会被阻止。
有任何想法吗?
这是(部分)调用堆栈:
MyDLL.dll!MyShellFolder::GetAttributesOf(unsigned int uCount, const _ITEMIDLIST * * aPidls, unsigned long * pdwAttributes) Line 385 C++
shell32.dll!CShellItem::GetAttributes(unsigned long,unsigned long *) Unknown
shell32.dll!CDefView::_SelectionHasFolderJunction(void) Unknown
shell32.dll!CDefView::_ZoneCheckFrame(unsigned long,int) Unknown
shell32.dll!CDefView::_InvokeContextMenuVerbOnSelectionWorker(char const *,unsigned int) Unknown
shell32.dll!CDefView::_InvokeContextMenuVerbOnSelection(char const *,unsigned int) Unknown
shell32.dll!CDefView::OnActivateSelection(unsigned long) Unknown
ExplorerFrame.dll!UIItemsView::WndProc(struct HWND__ *,unsigned int,unsigned __int64,__int64) Unknown