【问题标题】:Problem debugging shell extension in Vista (IShellFolder)在 Vista (IShellFolder) 中调试 shell 扩展时出现问题
【发布时间】:2010-10-12 01:09:43
【问题描述】:

我使用 ATL (Visual Studio 2008) 创建了一个 Windows Shell 扩展。它有以下模块,每个模块都是一个单独的 ATL 简单对象,有自己的 .rgs 文件用于注册:-

  1. IShellFolder/IShellView -> 用于 Windows 资源管理器中的虚拟驱动器
  2. IContextMenu/IShellExtInit -> 用于弹出菜单文件和文件夹
  3. IShellIconOverlayIdentifier - 在文件和文件夹上显示覆盖图标
  4. IShellPropSheetExt/IShellExtInit -> 用于文件和文件夹属性中的自定义属性页

以上在 WinXP 中工作正常,我可以在 WinXP 中调试这个 shell 扩展。但是当我切换到 Vista 时,我只会得到 (2) 和 (4) 的方法调用。该驱动器是在 Windows 资源管理器中创建的,但是当我单击它时不会调用底层方法。 虽然当我右键单击时,我被调用 (2),当我为文件或文件夹选择“属性”时,我进入 (4) 的代码。

Vista 上的 (1) 和 (3) 是否缺少某些界面。我在 MSDN 上找不到有关为 Vista 编写 Shell 扩展的完整详细文档。我已经阅读了有关 shell 扩展的 CodeProject 文章。

【问题讨论】:

    标签: windows shell-extensions


    【解决方案1】:

    问题是因为使用了 Xml SMART 指针。调用 Release() 时出现问题。

    检查此链接 Internet Explorer crashes when MSXML2::IXMLDOMDocumentPtr -> Release() is called

    【讨论】:

      【解决方案2】:

      确保您的扩展程序正确处理初始化,否则 verclsid.exe 不会让您的扩展程序被加载。 verclsid.exe 首先加载 shell 扩展并对它们进行快速检查,然后向 shell 发送“ok”,表明可以安全加载扩展。

      有关 verclsid.exe 的一些详细信息,请参阅here

      【讨论】:

      • 我无法完全找到正确的解决方案。我将 verclsid.exe 包含在防火墙的“允许”列表中,但是当我开始调试时,它显示 'explorer.exe': Loaded '...\Debug\ShellExtension.dll' 'explorer.exe': Unloaded '... \Debug\ShellExtension.dll' 并且没有命中断点
      • 与防火墙无关。除非你在你的 dll 初始化函数中做一些网络工作(你从不应该这样做)。调试窗口中的“(未)加载”行在这里没有帮助。您可以检查您的 init 函数在哪个进程中加载​​了 dll。
      • 我很抱歉回复晚了,我不在。 Init 函数是指 dllmain() 吗?在那里,我没有做太多 ::CoInitialize(NULL); if (dwReason == DLL_PROCESS_ATTACH) { _AtlModule.Init(); ::DisableThreadLibraryCalls(hInstance); } hInstance; return _AtlModule.DllMain(dwReason, lpReserved);
      • 我怀疑 IShellFolder 和 IPersistFolder 是否是需要在 Vista 中实现的唯一接口。可能还有另一个必需的接口
      • 不仅仅是 dllmain - verclsid 还在 QueryInterface() 上进行了一些测试,并且取决于它在其他一些接口上的扩展名。不:Vista 不需要实现任何不在 XP 上的接口。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多