【问题标题】:How do I install both 32-bit and 64-bit versions of a COM DLL and "auto-select"?如何安装 32 位和 64 位版本的 COM DLL 和“自动选择”?
【发布时间】:2011-05-23 03:44:23
【问题描述】:

我们有一个可以在 32 位和 64 位中正常编译的 DLL(COM 服务器),但 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?

【问题讨论】:

    标签: com 32bit-64bit


    【解决方案1】:

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

    【讨论】:

    • 忘了说...在 64 位机器上,\Windows\SysWow64\ 中有一个 32 位版本的 regsvr32.dll,用于在 Wow6432Node 区域注册 32 位 DLL。 (您只需要习惯完全违反直觉的命名模式。)我们的安装程序有问题 - 在 64 位机器上它不会使用 32 位 regsvr32.dll,但我们需要安装 32 位 DLL。所以我们最终编写了自己的版本并明确地运行它。
    • 至少在 Win7 上,regsvr32.exe 足够聪明,如果你针对相反类型的 DLL 运行它,它会自动调用它自己的另一个版本。 (这适用于 32 位和 64 位 DLL 以及 regsvr32.exe 的版本。)
    • @Leo:感谢您的提示。我读过它,但发现它在 Vista 上不适合我,所以我认为它只是夹缝中的东西。我是在完成安装程序后才开始在 Win7 上测试的。
    • 我们知道 32 位 DLL 可以注册到 C:\Windows\SysWOW64。但是我们正在尝试编译为原生 32 位和原生 64 位,如果现有的 32 位和新的 64 位应用程序可以在同一台机器上运行,那就太好了。 (DLL 是我们旗舰数据库产品的自动化编程库,客户端应用程序将使用该编程库来处理该产品。)
    • 应该可以的。您的 32 位客户端将加载 32 位服务器,而 64 位客户端将加载 64 位服务器。不需要你改变任何东西。从相同的源代码编译两个版本并照常进行。请确保您的注册是正确的,正如此处的 cmets 中所述。
    【解决方案2】:

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

    这通常由安装程序负责,例如 VS Setup 项目具有 TargetPlatform 属性。如果您想让 COM 服务器在 32 位和 64 位模式下都可用,那么您应该使用两个安装程序。或写入两组密钥的 64 位安装程序。在过去,拥有可以同时处理这两种情况的 COM 服务器非常是不寻常的。但在 .NET 中实现时并非闻所未闻。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2011-04-25
      • 2012-05-12
      相关资源
      最近更新 更多