我们有一个 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/