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++10object_map 加载失败。

与遇到的问题基本相同 swapnil_shinde here

DLL 显示为注册成功,并显示在 typelib 中,但不在 CLSID 中。 现有代码适用于 Window XP 上的 VC6,但不适用于 Window 7 上的 VC10。

使用atlbase.h in VC10DLLRegisterServer注册是公平的标准。

有人知道吗?

我们认为 *** 社区更活跃,知识更丰富。 如果我们错过了任何其他信息,请询问,我们也会提供。

非常感谢。

编辑: 我以管理员身份运行,在 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 可以工作的主要内容,如果未能解决你的问题,请参考以下文章

ATL 结构在来自 dll 的 COM 对象上中断

旧 c 代码到 ATL/COM dll

ATL COM dll 中的缓冲区溢出

为 32 位 DLL 编写 COM/ATL Wrapper 的正确方式

从 MFC 调用 ATL COM dll

[转]Replace all UUIDs in an ATL COM DLL.