将32位dll转换为64位

时间:2020-10-07 14:54:30

标签: c++ visual-studio dll 32bit-64bit

我不得不切换到Office 64位(2019,Professional Plus)。我有大量的VBA脚本,其中大多数调用以纯C语言编写并使用非常老的Developer Studio 97编译的旧32位dll。我设法在64位使用Visual Studio 2019将其重新编译为C ++ dll位,我遇到了2个问题:MessageBox(和MessageBoxA)功能被标记为“未定义”。解决方法:我暂时将它们替换为OutputDebugStringA,并且DLL可以正常编译。

从VBA调用该函数无法加载。感谢ProcessorMonitor,我发现我的dll尝试加载VCRUNTIME140D.dll和UCRBASED.dll。我从互联网上下载了它们,发现必须将它们放在C:\ Program Files \ Microsoft Office \ root \ Office16中。但这还不够! VCRUNTIME140D.dll 也必须也放置在C:\ WINDOWS \ SYSTEM32中!

那时,我的DLL可以作为64位dll正常工作。

下一个惊喜是,重新启动后,由于缺少VCRUNTIME140_APP.dll而再次无法加载(请注意,“ 140”之后没有“ D”)!下载并放置在C:\ Program Files \ Microsoft Office \ root \ Office16中,DLL可以正常工作。

我试图将其编译为“静态”(“代码生成”->“运行时库”->“多线程”而不是“多线程dll”),但出现错误: MSB8024不支持使用静态版本的C ++运行时库。

我在某处读到VCRUNTIME140与Visual Studio 2014有关...很奇怪,但也许我也想念该版本的某些.obj以便静态链接吗?为什么我需要旧系统中的元素?

回到MessageBox问题,我尝试了一个简单的c ++ 64位控制台应用程序,并且接受了完全相同的功能并按预期工作,因此我猜想头文件中的某些#ifdef排除了dll中的声明。在我的头文件中移动了MessageBox声明后,编译成功,但是(据我猜测)显示了MessageBox的链接器“ unresolved external”。

在这一点上,我的问题是: -是否可以创建64位 static .dll? -是 normal 我必须从网上下载上述3个dll并将其复制到某些目录中吗? -是否可以在64位dll中使用普通的MessageBox(句柄,文本,标题,按钮)?

谢谢。

1 个答案:

答案 0 :(得分:1)

最后,由于rustyx的直觉,我发现我正在使用适合“应用程序”开发的“解决方案”。 (在名为dll的名称中的字符串_APP表示了这一点!)我设法切换到“桌面”解决方案,现在加载的dll没有_APP后缀。 MessageBox函数可以正常运行,而无需在库中进行任何特定设置。

VCRUNTIME140D.DLL(调试版)和VCRUNTIME140.DLL(发行版)安装在我的安装中,但它们 是Visual Studio 2019(以及2015和2017)的一部分。

>

最后,在这种情况下,现在可以生成一个静态dll,VCRUNTIME140.DLL(以及更多)在运行时未加载,但相同的代码被静态链接。垃圾桶显示它。 动态链接: USER32.dll VCRUNTIME140.dll api-ms-win-crt-filesystem-l1-1-0.dll api-ms-win-crt-stdio-l1-1-0.dll api-ms-win-crt-heap-l1-1-0.dll api-ms-win-crt-string-l1-1-0.dll api-ms-win-crt-runtime-l1-1-0.dll 内核32.dll 静态链接: USER32.dll KERNEL32.dll

所有问题都解决了!