7

我必须支持使用旧 Borland 编译器(BC 5)用 C 语言编写的旧应用程序。

不幸的是,我们使用的旧 TCP/IP 库开始显示它已经过时并且在 Vista 和 Win7 机器上出现问题。

我有一个可用于 MS Visual C++ 的新函数库,我想用它来制作一个可以从 Borland C 调用的 DLL。

所以,我有两个问题:1)如何使 Visual C++ DLL 可以从 Borland C 程序调用,以及 2)如果它是可调用的,如何从普通的旧 C 调用 C++ 函数?

理想情况下,整个项目都应该转换为 Visual C,但是有许多遗留功能将使该项目成为一项重大任务!我正在寻找一个快速的补丁来让它存活一段时间:)

史蒂夫

4

2 回答 2

6

使用 Visual C++ 编写一个 DLL,将其接口公开为 Windows STDCALL C 函数。Windows API 函数以类似方式完成。您在界面中公开的那些功能将执行您需要在程序中替换的功能。在 DLL 中,放弃调用新的 MS VC++ 库。

因此,要获得一个可从 C 调用并使用 STDCALL 堆栈协议的函数,请执行以下操作:

extern "C" int __stdcall foo();

您还必须添加信息以从 DLL 导出函数。您可以在声明中明确地这样做:

extern "C" __declspec(dllexport) int __stdcall foo();

但是你需要一个单独的头文件用于你的 BorlandC 代码(它可能有不同的语法来指定 DLL 导入部分和 STDCALL 部分)。在 Visual C++ 中,您将在客户端中使用的声明类似于:

extern "C" __declspec(dllimport) int __stdcall foo();

于 2011-01-04T23:22:21.440 回答
2

您可以使用 Borland 的 IMPLIB 实用程序创建 Borland OMF 导入库:IMPLIB -a "whatever.omf" "whatever.dll",其中 DLL 文件是由 MSVC 创建的。

-a 选项用于与 Microsoft 兼容。生成的 OMF(Borland 的导入库文件格式)与指定导出函数及其调用约定的头文件相结合应该可以工作......(我相信 IMPLIB 出现在 C++ Builder 5 中。)

http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devwin32/imlib_xml.html

于 2011-01-05T02:56:40.317 回答