如何安装COM DLL的32位和64位版本并“自动选择”?

时间:2010-12-09 21:53:03

标签: 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?

2 个答案:

答案 0 :(得分:14)

两个版本都可以(实际上应该)为所有内容使用相同的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键。

答案 1 :(得分:8)

这是在Windows内部使用名为“Registry redirection”的功能处理的。在64位版本的Windows上,32位程序获得了不同的注册表视图。对于COM服务器使用的密钥类型,将重定向对HKCR别名或HKLM \ Software根目录的任何访问权限。 32位程序实际上看到存储在HKLM \ Software \ Wow6432Node中的键值。您可以使用Regedit.exe

查看它

这通常由安装程序处理,VS Setup项目具有TargetPlatform属性。如果要在32位和64位模式下使COM服务器可用,则应使用两个安装程序。或者是一个写入两组密钥的64位安装程序。拥有可以同时处理这两者的COM服务器在过去的日子里非常非正常。但是,例如,当您在.NET中实现时,并非闻所未闻。