com - 如何安装 32 位和 64 位版本的 COM DLL 和 "auto-select"?

标签 com 32bit-64bit

我们有一个 DLL(一个 COM 服务器),它可以在 32 位和 64 位中很好地编译,但是 DLL 对 32 位和 64 位版本使用相同的 CLSID 和 AppID。这是可以的还是必须改变?
我问这个是因为显然在 64 位机器上,我们不能同时注册 32 位版本和 64 位版本。如果 32 位客户端应用程序可以自动使用 32 位 DLL,而 64 位客户端应用程序可以自动使用 64 位 DLL,那就太好了。
在相关说明中,我们有客户端应用程序的源代码和 Visual Studio 2005 项目文件……我们如何编译同一应用程序的 32 位和 64 位版本?它是一个 C# 应用程序,它包含对我们的 COM 服务器 DLL 的引用,如下所示:

<ItemGroup> <COMReference Include="ComServer">

<Guid>{C1FADEA6-68FD-4F43-9FC2-0BC451FA5D53}</Guid>

<VersionMajor>830</VersionMajor> <VersionMinor>0</VersionMinor>

<Lcid>0</Lcid> <WrapperTool>tlbimp</WrapperTool> <Isolated>False</Isolated>

</COMReference> </ItemGroup>


如果事实证明我们需要一个单独的 64 位 CLSID,我们如何在 Visual Studio 中使这个引用“仅适用于 32 位配置”?或者我们是否必须拥有具有相同源代码的单独项目:一个引用 32 位 DLL,另一个引用 64 位 DLL?

最佳答案

两个版本都可以(并且确实应该)对所有内容使用相同的 GUID。

在 32 位机器上你不能注册或使用 64 位 DLL,所以那里没有问题。 64 位 DLL 根本不输入图片。

在 64 位机器上,64 位 DLL 在 HKLM/Software/Classes/CLSID(等)中注册,32 位 DLL 在 HKLM/Software/Wow6432Node/Classes/CLSID 中注册。 (我想知道你从哪里得到的建议,你不能在 64 位机器上注册 32 位 DLL ......)在 64 位机器上运行的 32 位客户端将在注册表中的正常位置查找,但操作系统会以静默方式将其重定向到 Wow6432Node 键。

关于com - 如何安装 32 位和 64 位版本的 COM DLL 和 "auto-select"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4403501/

相关文章:

reflection - 你如何找到没有 typelib 的 COM 接口(interface)?

C++ 32 位应用程序试图使用 64 位 MFC DLL

windows - 为什么 64 位进程不能使用 32 位 dll?

linux - 在 Linux 中使用 LD_PRELOAD 64 位/32 位混合环境

com - COM 错误 80010105 是什么意思,在哪里可以找到其他代码?

c++ - ->Release() 是在 COM 对象的析构函数上调用的吗?

c++ - 如何获取 com_ptr_t 中指针的地址

c++ - COM对象在多线程客户端中的初始化和实例化

winapi - 为什么Windows 64仍然使用user32.dll等?

java - eclipse:更改用于运行 ant 的 jre