У меня есть dll, который экспортирует
extern "C" __declspec(dllexport) int __stdcall Foo( void );
Дамп шоу dll
******************************************************************************
Section: Exports
File Offset: 00001400 (5120)
Flags: 00000000
Time Stamp: 00000000
Major Version: 0000
Minor Version: 0000
Exports from simple.dll
3 exported name(s), 3 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00002104 3 0000 std::nothrow
00001258 2 0001 Foo
000020F8 1 0002 ___CPPdebugHook
******************************************************************************
Я запустил со следующего файла определения:
LIBRARY simple.dll
EXPORTS
Foo
Это создало библиотечный файл со следующим экспортом:
Exports
ordinal name
_Foo
Когда я связываюсь с этой библиотекой, msvc компоновщик жалуется, что она не может найти _Foo@0. Для исправления этой проблемы я добавил псевдоним к файлу определения.
LIBRARY simple.dll
EXPORTS
Foo
Foo@0=Foo
Который приводит к библиотечному файлу с экспортом
Exports
ordinal name
_Foo
_Foo@0
Теперь проект связывается без любой проблемы. Однако, когда я пытаюсь выполнить его, я получаю сообщение
"Точка входа процедуры Foo@0 не могла быть расположена в динамически подключаемой библиотеке simple.dll"
Таким образом, кажется, что даже при том, что я сказал lib.exe, что Foo@0 является псевдонимом для Foo, он все еще создает библиотеку импорта, которая пытается загрузить "Foo@0" по имени.
Существует ли способ заставить библиотеку импорта загружать "Нечто", когда я попросил "Foo@0"?
Спасибо,
David
Вы правильно поняли, пытаясь использовать псевдоним ...
«кажется, что LIB не принимает формы с псевдонимом (он просто игнорирует часть после знака равенства); 2) он принимает на себя все функции в DEF-файл __cdecl. Второй момент заключается в том, что создаваемая им библиотека импорта сопоставляет каждый символ в DLL с внутренним именем с префиксом подчеркивания, т. Е. Компоновщик, использующий библиотеку импорта, будет пытаться разрешить неопределенный символ _Function в символ Функция в DLL. Он не заботится о соглашении о вызовах __stdcall. С помощью некоторых методов мы могли бы использовать LIB для создания библиотек импорта для функций __stdcall, но вызывающий мог вызывать их только по порядковому номеру, а не по имени. оставил как упражнение :-) ". ( http://wyw.dcweb.cn/stdcall.htm )
Вместо использования псевдонима используйте порядковый номер: (используя ваш пример):
LIBRARY simple.dll
EXPORTS
Foo
Foo@0 @2 ;(from your dumpbin)
Работал для меня:)