VC ++ / Dev-C ++: как включить DLL? - PullRequest
0 голосов
/ 30 августа 2011

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

Объявление "import" было бы

extern "C" int __stdcall getVersionNumber();

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

После того, как я потратил много часов на поиск проблемы в Google, без какого-либо результата (был только странныйматериал, написанный о файлах .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 дней: '- (

С уважением

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

1 Ответ

0 голосов
/ 31 августа 2011

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

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

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

...