VC ++ / Dev-C ++: как включить DLL?

Я написал DLL на Delphi, которая экспортирует функции. Я хотел бы использовать эти функции в программе на C ++ без использования динамического связывания (LoadLibrary () API-Call).

Декларация "импорт" будет

extern "C" int __stdcall getVersionNumber();

В основном я использую Bloodshed Dev-C ++, который создает исполняемые файлы Windows. Но я не знаю, как сказать компилятору, что он должен импортировать функцию getVersionNumber из STATMONDLL32.dll.

После того, как я потратил много часов на поиски проблемы без каких-либо результатов (были только странные вещи, написанные о файлах .a и .lib, которые я не скомпилировал с помощью Delphi ...), я также установил VC ++, но даже там , Я не смог найти способ указать компилятору использовать конкретную DLL.

Я создал файл DEF для этой библиотеки DLL - как я могу сказать Dev-C ++ и / или VC ++ использовать его? (Предпочтительнее Dev-C ++)

// Редактировать: Delphi создает НЕУКРАШЕННЫЕ символы. Это в точности символ getVersionNumber.

Я создал следующий файл DEF с псевдонимом для украшения:

LIBRARY   STATMONDLL32
EXPORTS
  getVersionNumberA = _getVersionNumberA@0

Я создал файл * .lib с VC ++ "lib.exe":

lib.exe /DEF:StatMonDll32.def /OUT:StatMonDll32.lib

Я включил библиотеку в настройки компоновщика VC ++.

Но VC ++ сообщает мне, что не может разрешить внешний символ _getVersionNumberA @ 0! Пожалуйста помоги!

// Изменить: я загрузил DLL сюда: http://www.viathinksoft.de/temp/StatMonDll32.dll. Можете ли вы получить доступ к символу getVersionNumberA с помощью VC ++? Ищу решение уже 6 дней: '- (

С наилучшими пожеланиями

Дэниел Маршалл


person Daniel Marschall    schedule 30.08.2011    source источник
comment
Не используйте Dev-C ++.   -  person Cat Plus Plus    schedule 31.08.2011


Ответы (1)


Вы можете использовать динамическое связывание, оно должно работать примерно так:

extern "C" typedef int (__stdcall *pfnadd)(int a, int b);
extern "C" typedef int (__stdcall *pfngetversion)(void);
HMODULE mod = LoadLibraryA("mydll.dll");
pfnadd add = (pfnadd)GetProcAddress(mod, "Add");
pfngetversion getVersionNumberA =
       (pfngetversion)GetProcAddress(mod, "getVersionNumberA");

а затем вы можете просто вызвать с помощью указателя функции:

add(1, 2);
std::cout << getVersionNumberA();

Хотя, похоже, в вашем вопросе есть кусочки двух разных функций!

person Ben Voigt    schedule 30.08.2011
comment
Спасибо за ваш комментарий. Я знаю, что могу использовать динамическое связывание, но я бы хотел сделать это статическим способом, например, DLL WinAPI связаны. В своем посте я говорил, например, о разных функциях, но в своем тесте использовал только одно имя. Интересно, почему никто не знает ответа на этот простой вопрос. Я просто хочу статически связать имя функции без декорирования. (Примечание: если бы имя было украшено символом @ 0, оно сработало бы (проверено). Но на самом деле Delphi создает символы без декорирования). - person Daniel Marschall; 31.08.2011
comment
@ Дэниел: Извините, я пропустил строчку в начале вашего вопроса, где вы сказали без LoadLibrary. Вам необходимо создать статическую библиотеку импорта, соответствующую DLL. cygwin предоставляет для этого хорошие инструменты (которые объясняют файлы .a, о которых вы узнали с помощью Google), MSVC ++ - в меньшей степени, и я понятия не имею о Dev-C ++. - person Ben Voigt; 31.08.2011
comment
Я не уверен, что такое статическая библиотека импорта. Разве я еще не создал его с помощью lib.exe, который создал файл * .lib из моего файла * .def? - person Daniel Marschall; 31.08.2011
comment
@ Дэниел: Я не знаю, какие параметры вы использовали для lib.exe, но вы ошиблись, если он все еще не связывает. - person Ben Voigt; 31.08.2011
comment
Я сделал это с помощью этой команды: lib.exe /DEF:StatMonDll32.def /OUT:StatMonDll32.lib. Файл lib создан (и я включил его в настройки компоновщика VC ++). Проблема в том, что DLL имеет недекорированный символ getVersionNumberA, а VC ++ хочет получить доступ к _getVersionNumberA @ 0 (из-за stdcall). Я предполагаю, что АЛИАС не сработал. Я заглянул внутрь файла LIB с помощью шестнадцатеричного редактора и увидел _getVersionNumberA вместо _getVersionNumberA @ 0. Я предполагаю, что @ 0 случайно интерпретируется как порядковое значение в файле DEF ... Я почти пробовал каждую комбинацию. - person Daniel Marschall; 31.08.2011
comment
Я загрузил DLL сюда: viathinksoft.de/temp/StatMonDll32.dll. Можете ли вы получить доступ к символу getVersionNumberA с помощью VC ++? Ищу решение уже 6 дней: '- ( - person Daniel Marschall; 01.09.2011