Problem debugging shell extension in Vista (IShellFolder)
我已经使用ATL(Visual Studio 2008)创建了Windows Shell扩展。它具有以下模块,每个模块是一个单独的ATL简单对象,带有自己的.rgs文件进行注册:-
IShellFolder / IShellView->对于Windows资源管理器中的虚拟驱动器
IContextMenu / IShellExtInit->用于弹出菜单的文件和文件夹
IShellIconOverlayIdentifier-在文件和文件夹上显示覆盖图标
IShellPropSheetExt / IShellExtInit->对于"文件和文件夹"属性中的自定义属性页面
以上在WinXP中可以正常工作,并且我可以在WinXP中调试此Shell扩展。但是,一旦我切换到Vista,我只会得到(2)和(4)的方法调用。该驱动器是在Windows资源管理器中创建的,但是单击该驱动器时不会调用其基础方法。
尽管当我单击鼠标右键时,我会被要求(2),而当我为文件或文件夹选择"属性"时,我会进入(4)的代码。
在Vista上是否缺少针对(1)和(3)的某些接口。我找不到有关在MSDN上编写Windows Vista的Shell Extensions的完整而详细的文档。我已经阅读了有关Shell扩展的CodeProject文章。
问题是由于使用了Xml SMART Pointer。 调用Release()时出现问题。
检查此链接
调用MSXML2 :: IXMLDOMDocumentPtr-> Release()时Internet Explorer崩溃
确保您的扩展正确处理了初始化,否则verclsid.exe不会让您的扩展被加载。
verclsid.exe首先加载外壳扩展,并对外壳扩展进行快速检查,然后再向外壳发送" ok"指示加载扩展是安全的。
有关verclsid.exe的一些详细信息,请参见此处。
-
我无法完全找到正确的解决方案。我在防火墙"允许"列表中包括了verclsid.exe,但是当我开始调试时,它显示了explorer.exe:已加载... \ Debug \ ShellExtension.dllexplorer.exe:已卸载... \ Debug \ ShellExtension.dll和断点没有命中
-
它与防火墙无关。除非您在dll init函数中做过一些网络工作(您永远都不会做)。调试窗口中的"(un)loaded"行对此无济于事。您可以签入init函数来加载dll。
-
我为迟到的回复道歉,我不在了。通过Init函数,您是指dllmain()吗?在那儿,我没有做太多:: CoInitialize(NULL);如果(dwReason == DLL_PROCESS_ATTACH){_AtlModule.Init(); :: DisableThreadLibraryCalls(hInstance); } hInstance;返回_AtlModule.DllMain(dwReason,lpReserved);
-
我怀疑IShellFolder和IPersistFolder是否是Vista中唯一需要实现的接口。可能还需要另一个接口
-
不只是dllmain-verclsid还对QueryInterface()进行了一些测试,并且还取决于其他接口上的扩展名。否:Vista不需要实现XP上没有的任何接口。
-
在哪里可以找到此QueryInterface()初始化?
-
QueryInterface是IUnknown接口的一部分
-
是的,但我找不到实现。