У меня есть DLL, написанная на ассемблере x86. Все экспорты относятся к stdcall
функциям. Весь экспорт не отделан.
Мне нужно, чтобы эта DLL-библиотека была связана с проектом C с использованием библиотеки импорта. LoadLibrary
или изменение имени экспорта и т. Д. Не вариант.
У меня 2 проблемы
- Когда я создаю файл библиотеки импорта (.lib) для DLL из файла DEF с именами экспорта, все имена оформляются на
cdecl
! Я не могу найти способ указать их как недекорированные stdcall
. Ни одно из этих украшенных имен не существует в DLL, поэтому во время выполнения ничего не будет работать, даже если компиляция была возможна.
- Когда я пишу код для вызова функции DLL в MSVC, независимо от того, указывается ли stdcall или нет, компилятор изменяет имена функций. Поэтому вызов
ExampleFunction
становится _ExampleFunction@12
, и мне нужно, чтобы он был только ExampleFunction
.
К счастью, то, что мне нужно, ДОЛЖНО быть возможным, потому что системные библиотеки Windows (например, kernel32.dll, user32.dll и т. Д.) Следуют точно таким же соглашениям. Каждая экспортируемая функция является stdcall и не украшена.
Я уже читал это: https://qualapps.blogspot.com/2007/08/how-to-create-32-bit-import-libraries.html
Я столкнулся с этими проблемами:
- с использованием
extern "C"
здесь не применимо, так как это C-проект. Этот спецификатор даже не будет работать, и, несмотря на то, что это C-проект, имена все равно изменяются.
- Создание файла .lib из файла DEF только с необработанными именами функций не работает. Имена изменяются.
Файл example-lib.def
выглядит следующим образом:
LIBRARY example-lib.dll
EXPORTS
ExampleFunction
Файл .lib
создается с помощью этой команды:
lib.exe /def:example-lib.def /OUT:example-lib.lib
Запись в файле lib выглядит следующим образом при использовании dumpbin.exe /headers example-lib.lib
Version : 0
Machine : 14C (x86)
TimeDateStamp: 5CDBA30C Wed May 15 06:26:36 2019
SizeOfData : 00000016
DLL name : example-lib.dll
Symbol name : _ExampleFunction
Type : code
Name type : no prefix
Hint : 20
Name : ExampleFunction
Я импортирую, делая декларации этого:
extern void __stdcall ExampleFunction(int a, int b, int c);
Я вызываю функцию так:
ExampleFunction(1, 2, 3);
Файл lib и каталог, в котором он находится, указываются в настройках проекта VC.
Когда код, вызывающий ExampleFunction
, компилируется, компоновщик не завершит работу, поскольку он не может найти _ExampleFunction@12
в моем DEF-файле. И даже если это присутствует в файле DEF, программа не запустится, потому что _ExampleFunction@12
не экспортируется в фактический раздел экспорта DLL. Только простая ExampleFunction
экспортируется.
Так как мне добиться, чтобы программа на языке C вызывала ExampleFunction из DLL в точности как есть? Как это сделать, когда проект C вызывает функцию из user32.dll? Могу ли я использовать ту же процедуру для достижения этой цели?