【问题标题】:Using a Visual C++ DLL in old Borland C?在旧 Borland C 中使用 Visual C++ DLL?
【发布时间】:2011-06-03 17:12:09
【问题描述】:

我必须支持使用旧 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,但有许多遗留功能将使该项目成为一项重大任务!我正在寻找一个快速的补丁来让它存活一段时间:)

史蒂夫

【问题讨论】:

  • 你还有 borland C 编译器吗?如果是这样,您可以尝试减少应用程序和库之间的接触区域。

标签: c++ c visual-c++ dll turbo-c


【解决方案1】:

您可以使用 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/implib_xml.html

【讨论】:

    【解决方案2】:

    使用 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();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多