我希望这里有人能够了解导致这个问题的原因。我已经为Explorer提供了几个COM扩展,它们提供了ShellIconOverlay和ContextMenu,并且叠加层工作得很好。当我单击桌面时,上下文菜单工作正常,但是当我右键单击任何资源管理器实例时,我可以看到在调试器中查询的接口和生成的IShellExtInit实例但是在资源管理器中没有调用初始化函数实例,但从桌面调用它并在之后立即查询ContextMenu项。
以前有人在这看过这样的事吗?
答案 0 :(得分:2)
如果您正在调试shell扩展,可能是您有时间终止正在运行的explorer.exe进程并启动一个新进程。当你开始一个新的运行时,它是否与原始运行时具有相同的完整性级别?
您的资源管理器设置是否说要在新进程中浏览文件?如果是,那么该进程是否以与原始进程相同的完整性级别运行?
此外,由于您正在运行调试器,因此您可能构建了调试版本。 explorer.exe有时会尝试加载DLL的调试版本,有时会尝试加载DLL的发布版本吗?
答案 1 :(得分:0)
好的,我在这里遇到了完全相同的问题,事实证明这个问题与
有关ThreadingModel = Apartment
基本上,我认为您遇到的是,explorer.exe的第二个主题(桌面在STA线程中运行)使用默认(遗留)ThreadingModel
- 并期望您的COM
实施IMarshal
来做IPC。 Apartment
ThreadingModel
允许您的IShellExt
类的多个实例共存。
警告 - 如果您使用ActiveQt
开发Context Menu Shell Extensions,则可以使用更多技巧。