Window 7 上的 ATL COM DLL 注册无法更新 CLSID 部分,但 TypeLib 可以工作
Posted
技术标签:
【中文标题】Window 7 上的 ATL COM DLL 注册无法更新 CLSID 部分,但 TypeLib 可以工作【英文标题】:ATL COM DLL registration on Window 7 failed to update CLSID section but TypeLib works 【发布时间】:2012-09-09 11:47:02 【问题描述】:我们正在处理 ATL COM DLL 迁移项目,将代码从 VC++6 迁移到 VC++10,object_map 加载失败。
与遇到的问题基本相同 swapnil_shinde here
DLL 显示为注册成功,并显示在 typelib 中,但不在 CLSID 中。 现有代码适用于 Window XP 上的 VC6,但不适用于 Window 7 上的 VC10。
使用atlbase.h in VC10的DLLRegisterServer注册是公平的标准。
有人知道吗?
我们认为 *** 社区更活跃,知识更丰富。 如果我们错过了任何其他信息,请询问,我们也会提供。
非常感谢。
编辑: 我以管理员身份运行,在 32 位窗口 7 上进行 32 位应用程序测试。 我已经在整个注册表中搜索了 CLSID 仍然找不到它。
【问题讨论】:
其实在Win7中有一些CLSID的重定向机制。谷歌一下,你会得到很多资源。 32/64 位组件? 32/64 位 Windows? regsvr32 成功了吗? 检查以下..link 谢谢大家。我们已经在 32 位窗口 7 上尝试过,该应用程序也是 32 位的。我现在正在研究重定向机制。 如果你尝试运行会发生什么:regsvr32 YourComponent.dll 【参考方案1】:尝试使用OBJECT_ENTRY_AUTO
宏注册您的对象。在每个对象的标题中,在类声明之后放置对条目的引用,例如:
class CMyObject ... class decl ... ;
OBJECT_ENTRY_AUTO(__uuidof(MyObject), CMyObject)
如果这不起作用,您需要通过调试器运行它(使用 regsvr32 作为 EXE)并观察 DllRegisterServer 中发生的情况。
【讨论】:
我们也试过这个MARCO。 CLSID 的条目映射为空。当我们使用 VC6 构建时,代码可以工作。会不会是 VC10 的 ATL 库中的 bug? 我会感到惊讶。有很多人依赖VC10的ATL代码。 AtlComModuleRegisterServer 是否至少进入了“for”循环,即地图中的对象? 如果它在地图中但 CLSID 为空,请尝试使用 IID_MyObject 而不是 __uuidof(MyObject)。以上是关于Window 7 上的 ATL COM DLL 注册无法更新 CLSID 部分,但 TypeLib 可以工作的主要内容,如果未能解决你的问题,请参考以下文章