我使用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年前)构建的。它使用ATL宏(如BEGIN_COM_MAP和BEGIN_SINK_MAP)来声明其各种接口的实现。它必须重新编译,因为它调用的COM服务器已更改(新的ProgID,新GUID,新类型库等)。除了进行这些调整和使用当前的VS之外,没有(有意的)更改 - 在项目文件的旧等效项中肯定没有任何指向64位的内容。
使用64位版本的DEPENDS.EXE检查DLL会在标准引用的DLL(如KERNEL32和USER32)旁边显示“64”图标。除了在64位机器上构建DLL之外,我找不到关于DLL的“64位”。目标明确是Win32(而不是X64)。
使用32位版本的DEPENDS.EXE检查DLL(在Virtual PC上运行的Windows XP上)显示带有红色图标的KERNEL32.DLL,显然是因为存在对FlsAlloc FlsFree FlsGetValue FlsSetValue的引用, 32位KERNEL32.DLL。 (我不知道那些是什么,也不知道那些引用来自哪里 - 可能来自编译完成的64位机器上的MFC副本?)
难道我必须在XP上安装VS2012并在那里重新编译吗?怎么可能真的需要做什么来使用当前的Visual Studio在C ++中构建Win32 COM对象?
有谁知道我的样子?我检查了所有项目和解决方案选项,似乎没有设置为64位。 “使用MFC”下的选项设置为“使用标准Windows库” - 这可能就是答案,但如果不能将其移植到32位Windows,则很难仅使用“标准库”。 (我会在发送之后尝试对其进行更改。)
提前感谢任何建议。
答案 0 :(得分: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安装最新的可用更新。
您可以在项目设置下使用该设置:
在此处查看更多内容:Configuring C++ 11 Programs for Windows XP。