3

我使用 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,显然是因为在 32 位中不存在对 FlsAlloc FlsFree FlsGetValue FlsSetValue 的引用内核32.DLL。(我不知道那些是什么,也不知道这些引用来自哪里——也许来自编译完成的 64 位机器上的 MFC 副本?)

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

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

提前感谢您的任何建议。

4

1 回答 1

3

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

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

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

在此处输入图像描述

在此处查看更多信息:为 Windows XP 配置 C++ 11 程序

于 2013-08-01T12:23:08.257 回答