我使用 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,则几乎不能只使用“标准库”。(发送后我将尝试对此进行更改。)
提前感谢您的任何建议。