【问题标题】:Windows Shell Extension Not Calling InitializeWindows Shell 扩展未调用初始化
【发布时间】:2011-08-27 15:07:17
【问题描述】:

我希望这里有人对可能导致此问题的原因有所了解。我已经为 Explorer 实现了几个 COM 扩展,它们提供了 ShellIconOverlays 和一个 ContextMenu,并且这些覆盖完美地工作。当我单击桌面时,上下文菜单工作正常,但是当我在任何资源管理器实例中单击鼠标右键时,我可以看到在调试器中查询的界面和正在生成的 IShellExtInit 实例,但在资源管理器中没有调用初始化函数实例,但它可以从桌面正常调用,之后会立即查询 ContextMenu 项。

这里有人见过这样的事情吗?

【问题讨论】:

    标签: c++ windows shell com contextmenu


    【解决方案1】:

    如果您正在调试一个 shell 扩展,您可能有机会终止正在运行的 explorer.exe 进程并启动一个新进程。当您启动一个新的时,它的运行完整性级别是否与原始级别相同?

    您的资源管理器设置是否要求在新进程中浏览文件?如果是,该进程是否以与原始进程相同的完整性级别运行?

    此外,由于您正在运行调试器,因此您很可能构建了调试版本。 explorer.exe 是否有时会尝试加载 DLL 的调试版本,有时会尝试加载 DLL 的发布版本?

    【讨论】:

    • 您能否详细说明您答案的“诚信等级”部分?我遇到了同样的问题,youtube.com/watch?v=NEq1S2y6Y14,发布构建等。我确实收到了对 IShellExtInit 实例的 createAggregate() 和 queryInterface() 调用,但从未调用 Initialize。当它从桌面、打开窗口对话框等运行时,它调用。
    • 有许多作者的许多 MSDN 文章和博客帖子。完整性级别分为高、中和低。以不同完整性级别运行的应用程序彼此隔离,即使在同一个桌面上也是如此。 explorer.exe 进程通常以中等完整性运行。如果有人以管理员身份运行 Visual Studio 并调试进程,那么它可能是高完整性的。在某些情况下 explorer.exe 可能以高完整性运行,因此如果应用程序以中等完整性运行,问题可能正好相反。
    • 谢谢。结果证明是不相关的——我一直认为完整性概念是围绕 Vista 引入的,而我在 XP 中一直遇到这些错误。
    • 您说得对,Vista 引入了完整性级别。
    【解决方案2】:

    好的,我在这里遇到了完全相同的问题,结果证明问题与

    有关
    ThreadingModel = Apartment 
    

    基本上,我认为您正在经历的是 explorer.exe 的 second 线程(桌面在 STA 线程中运行)使用默认(旧版)ThreadingModel - 并期望您的 @987654323 @实现IMarshal做IPC。 Apartment ThreadingModel 允许您的 IShellExt 类的多个实例共存。


    警告 - 如果您使用ActiveQt 开发上下文菜单外壳扩展,则可以使用更多技巧。

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多