Использование Visual C ++ DLL в старых Borland C? - PullRequest
7 голосов
/ 05 января 2011

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

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

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

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

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

Steve

Ответы [ 2 ]

6 голосов
/ 05 января 2011

Напишите DLL с использованием Visual C ++, которая предоставляет свой интерфейс в качестве функций 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();

2 голосов
/ 05 января 2011

Вы можете создать импортные библиотеки Borland OMF с помощью служебной программы Borland IMPLIB: IMPLIB -a "what.omf" "what.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

...