c++ - 调用 CComModule.RegisterServer、_AtlComModule.RegisterServer 和 LoadTypeLibEx 进行 TypeLib 注册有什么区别?

标签 c++ windows com 64-bit atl

在我的 COM dll 的 DllRegisterServer 方法中,我以前有调用 LoadTypeLibEx(module, REGKIND_REGISTER, &pTypeLib) 的代码来注册我的 COM 类及其相应的 TypeLib。我的 COM DLL 是 64 位的。我注意到在我的 64 位 Vista 系统上,在 HKCR:\\TypeLib\{myguid}\1.0\0 下,我找到了一个 win32 子项,其中包含我的 COM DLL 的位置。

我在单独的 COM DLL 中还有一些其他代码,我支持这些代码使用旧的、现已弃用的 CComModule.RegisterServer(TRUE) 调用。此代码在 0 项下为 64 位 DLL 创建一个 win64 子项,在 0 项下为 32 位 DLL 创建一个 win32 子项。在所有情况下,我都使用正确位版本的 regsvr32 进行注册(将 regsvr32 位数与 DLL 位数相匹配)。

为什么 LoadTypeLibEx 和 _AtlComModule.RegisterServer 都没有为包含我的 TypeLib 的 64 位 dll 创建 win64 key ,而旧的 CComModule.RegisterServer 创建正确的 key ?

最佳答案

似乎我所看到的关于 win32/win64 子键的行为反射(reflect)了这样一个事实,即某些类型库可以在 64 位和 32 位程序中使用,因为它们不包含位约束(读取:指针)参数。同时,其他类型库需要针对 win32 和 win64 的不同条目,因为它们不兼容。

因此,我看到的行为似乎并不是因为我使用的注册方法,而是因为底层类型库。

关于c++ - 调用 CComModule.RegisterServer、_AtlComModule.RegisterServer 和 LoadTypeLibEx 进行 TypeLib 注册有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/698472/

相关文章:

c++ - 在 C++ 中编写移动构造函数时是否必须编写复制构造函数?

c++ - 在 Linux 系统上使用 c++ 链接到共享和静态库

c++ - Embarcadero TThread : Pass TThreadMethod in C++

windows - 将文件从 Windows 计算机复制到 Linux

windows - 在 emacs 中重新加载 Clojure 文件

windows - 编辑注册表值

c++ - 如何在 C++ 中实现接口(interface)?

c++ - Word 自动化 - 另存为

c# - Excel DNA - 在回调中将 C# 字符串编码到 VBA ByRef

c# - 跟踪 com 对象 c# 的发布。