无法在 32 位机器上注册使用 VS2012/VC++ 构建的 COM DLL

Posted

技术标签:

【中文标题】无法在 32 位机器上注册使用 VS2012/VC++ 构建的 COM DLL【英文标题】:Cannot register COM DLL built with VS2012/VC++ on 32-bit machine 【发布时间】:2013-07-31 11:08:09 【问题描述】:

我使用 Visual Studio 2012 构建了一个基于 C++ 的 COM 对象。它在 64 位机器上注册并正常工作(由 32 位代码调用并调用 32 位进程外 COM 服务器)但不注册在 32 位机器上(XP 和 Win7 32 位都不是)。来自 regsvr32 的消息是

LoadLibrary("comobj.dll") failed - The specified procedure could not be found.

该项目最初是使用 Visual Studio 6(7 年前)构建的。它使用 BEGIN_COM_MAP 和 BEGIN_SINK_MAP 等 ATL 宏来声明其各种接口的实现。它必须重新编译,因为它调用的 COM 服务器发生了变化(新的 ProgID、新的 GUID、新的类型库等)。除了进行这些调整并使用当前的 VS 之外,没有(有意的)更改 - 在旧的等效项目文件中肯定没有任何内容指向 64 位。

使用 64 位版本的 DEPENDS.EXE 检查 DLL 会在标准引用的 DLL(如 KERNEL32 和 USER32)旁边显示“64”图标。除了在 64 位机器上构建 DLL 之外,我找不到任何关于 DLL 的“64 位”。目标是明确的 Win32(不是 X64)。

使用 32 位版本的 DEPENDS.EXE(在 Virtual PC 下运行的 Windows XP 上)检查 DLL 会显示带有红色图标的 KERNEL32.DLL,显然是因为对 FlsAlloc FlsFree FlsGetValue FlsSetValue 的引用不存在于32 位 KERNEL32.DLL。 (我不知道那些是什么,也不知道这些引用来自哪里——也许来自编译完成的 64 位机器上的 MFC 副本?)

难道我必须在 XP 上安装 VS2012 并在那里重新编译?使用当前的 Visual Studio 在 C++ 中构建 Win32 COM 对象真的需要这样做吗?

有人知道我在哪里看吗?我检查了所有项目和解决方案选项,似乎没有设置为 64 位。 “使用 MFC”下的选项设置为“使用标准 Windows 库”——这可能是答案,但如果它不能移植到 32 位 Windows,则几乎不能只使用“标准库”。 (我会在发送后尝试对此进行更改。)

提前感谢您的任何建议。

【问题讨论】:

使用 Visual Studio 2012 构建,您需要使用 v110_xp 工具集以保持 XP 兼容。 感谢您提供的信息。当我知道我是否需要做这一切来解决这个问题时,我会更新这个。 使用这些信息,我能够让事情正常进行。请添加具有相同信息的答案(如果您愿意,请删除评论),我会将其标记为这样 - 这是我能做的至少,因为您通过为我指出正确的方向为我节省了很多时间。跨度> 【参考方案1】:

Visual Studio 2012 附带的默认工具集通过使用某些后来在 Vista 中引入的 API 产生与 Windows XP 不兼容的输出。

为了利用最新的 Microsoft C++ 编译器的强大功能和丰富的功能,并且仍然与 Windows XP 兼容,您需要使用 Visual Studio 2012 Update 1 引入的替代工具集代号“v110_xp”。目前可用的最新更新是 Visual Studio Update 3,您可能只想安装 Visual Studio 的最新可用更新。

您在项目设置下有可用的设置:

在此处查看更多信息:Configuring C++ 11 Programs for Windows XP。

【讨论】:

你是对的,但他的核心问题是他还没有安装任何更新。他仍在使用 CRT 的 RTM 版本,该版本对 FlsAlloc() 具有直接的动态链接依赖性。你可以推荐this link @HansPassant:当然,我提到了更新 1,但安装最新的更新是有意义的,也就是更新 3。我添加了上面的链接,谢谢。 在搜索 VS2012 的更新时,我很容易找到“更新 3”——这个答案很有价值,因为它为我指明了正确的方向。我很幸运在“更新 2”出现后没有问这个问题,破坏了“更新 1”提供的 XP 支持。我必须做的工作是微不足道的。最大的谜团是 VS2012 RTM 如何默认为“不支持 XP(针对 C++)”,而在安装对 C++ 的支持时不会警告您该问题。

以上是关于无法在 32 位机器上注册使用 VS2012/VC++ 构建的 COM DLL的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 64 位机器上正确读取 HKCU 中的 32 位注册表值?

Regsvr32 在64位机器上的用法(转载)

64位 regsrv win10_Regsvr32 在64位机器上的用法

64位 regsrv win10_Regsvr32 在64位机器上的用法

整数运算性能 32 与 64 位

microsoft ace oledb 12 未在本地机器上注册