Использование Visual C ++ DLL в старой Borland C?

Я должен поддерживать старое приложение, написанное на C, используя старый компилятор Borland (BC 5).

К сожалению, старая библиотека TCP / IP, которую мы использовали, начинает показывать ее возраст и имеет проблемы с машинами Vista и Win7.

У меня есть новая библиотека функций, доступных для MS Visual C ++, и я хотел бы использовать ее для создания DLL, которая могла бы быть вызвана из Borland C.

Итак, у меня есть 2 проблемы: 1) как сделать Visual C ++ DLL вызываемой из Borland C-программы, и 2) если она вызываема, как вызвать функции C ++ из простого старого C?

В идеале весь проект должен быть преобразован в Visual C, но есть много унаследованных функций, которые сделают этот проект крупным делом! Я ищу быстрый патч, чтобы держать его в живых дольше 🙂

Стив

Напишите DLL, используя Visual C ++, который предоставляет свой интерфейс как функции Windows STDCALL C. Аналогичным образом выполняются функции Windows API. Те функции, которые вы открываете в интерфейсе, будут выполнять функции, которые необходимо заменить в вашей программе. Внутри DLL вызовите новую библиотеку MS VC ++ с отказом.

Таким образом, чтобы получить функцию, вызываемую из C и использующую протокол STDCALL stack, сделайте что-то вроде этого:

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

Вы можете создавать экземпляры импорта Borland OMF с помощью утилиты IMPLIB от Borland: 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