Создание MSVC импортирует библиотеку из DLL, который использует stdcall

У меня есть 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

6
задан David 6 March 2010 в 16:29
поделиться

1 ответ

Вы правильно поняли, пытаясь использовать псевдоним ...

«кажется, что 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)

Работал для меня:)

5
ответ дан 17 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: