внешний "C" не работает, как ожидалось - PullRequest
0 голосов
/ 13 ноября 2010

Я пытаюсь подключить функцию Win32 API.Я делаю DLL, из которой я хочу экспортировать функцию, но у меня уже не получается с основами.Мое объявление выглядит следующим образом:

extern "C" __declspec(dllexport) int WINAPI fnTest(void);

, но имя экспортируемой функции не "fnTest" - как я и ожидал - это "_fnTest @ 0".Я могу заставить его работать только при объявлении соглашения о вызове функций на __cdecl, что приводит к экспортированному имени "fnTest", но, поскольку Win32 вызывает соединение WINAPI/__stdcall, это не вариант.

Я использую VS2010.Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2010

Это искажение является частью __stdcall соглашения. Поскольку вызываемая функция отвечает за удаление параметров из стека по возвращении, а удаление неправильного объема данных из стека имеет катастрофические последствия, число байтов, которые берут параметры, просто добавляется к имени функции после "@" пусть компоновщик уловит потенциальные конфликтующие ошибки определения.

Не могли бы вы объяснить, как это создает проблему?

1 голос
/ 13 ноября 2010

Вы должны использовать файл определения модуля (.def) вместо __declspec(dllexport).
Просто используйте следующий файл .def:

EXPORTS
fnTest
0 голосов
/ 13 ноября 2010

Если вы хотите сделать это, вам придется экспортировать функции по порядковому номеру , а не по имени, используя файл .DEF.

stdcall обеспечивает декорацию, которая описывает длину параметров, в данном случае @0, поскольку у вас нет параметров.Если бы у вас был один параметр, это было бы @4 и т. Д.

...