在 Visual C++ 中链接到旧的第三方 DLL

Posted

技术标签:

【中文标题】在 Visual C++ 中链接到旧的第三方 DLL【英文标题】:Linking to an old third party DLL in Visual C++ 【发布时间】:2013-01-21 11:31:37 【问题描述】:

我正在将一个 C++ 项目从旧的 Borland 编译器移植到 VisualStudio 2008。这个项目使用了我没有源代码的第三方 DLL,因此我无法重新编译或修改它。 DLL 的头文件定义的函数如下:

extern "C" 
void __stdcall Init(int a, int b);

但是,当我尝试链接到这个 DLL 时,VisualStudio 说它找不到函数 _Init@8。当我查看 DLL 时,我发现函数名称是 _Init,而不是 _Init@8(似乎早于 Microsoft 的 DLL 将 @8 添加到 stdcall 名称修改)。

我的问题是:如何在这个 DLL 中调用函数? VisualStudio 是否根本不支持这些旧的 DLL,或者是否有我缺少的标志/设置。 (我知道我可以使用 LoadLibrary/GetProcAddress 函数在运行时动态调用这些函数,但我不想这样做。)

【问题讨论】:

【参考方案1】:

我没有注意到任何可以告诉我您是在进行 32 位还是 64 位编码的信息。 MSDN 提供了一些关于如何基于您没有源代码的 dll 创建导入库的信息。本文用于制作32 bit import library。干杯!

【讨论】:

我使用的是 32 位。虽然您的链接没有直接解决我的问题,但它确实让我沿着正确的思路思考。解决方案是使用 def 文件(如链接所述,并且我已经尝试使用 Borland 的 impdef 和 implib),但在 EXPORT 部分添加别名:'_Init@8 = Init'

以上是关于在 Visual C++ 中链接到旧的第三方 DLL的主要内容,如果未能解决你的问题,请参考以下文章

从旧的 Borland C++ 迁移到 Visual C++ Express

一些资产没有加载到旧的 Rails 3-2-stable 应用程序中

将新的 MS C++ 编译器与旧的 Visual Studio 一起使用

在 ABI 级别的 Visual Studio 中使用 C++ 重新实现 DLL 方法变量

[Dead]如何使用异步回发成功 POST 到旧的 ASP.NET 站点

如何最好地将一个巨大的.sqlite数据库移动到旧的低内存iOS设备上的新目录中?