Возможно ли иметь экспортированную функцию в __stdcall и имя не исправлено?

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

example.h

DWORD __stdcall DoSomething(byte aByte);

example.dll в Уокере зависимостей:

2 (0x0002)   2 (0x0002)   DoSomething   0x000831C0

Насколько я прочитал, можно ли экспортировать функцию в __stdcall условно, его имя должно читаться в ходунке зависимостей как:

2 (0x0002)   2 (0x0002)   _DoSomething@1   0x000831C0

Означает ли это, что наш заголовочный файл не соответствует скомпилированной DLL или я что-то упустил?

В конечном счете, как мне сформировать экспорт фиктивной функции, которая будет вести себя так же, как реальная DLL, которую я эмулирую?

3

Решение

Есть только два способа не получить оформление имени __stdcall:

  • Вы должны использовать файл .def, чтобы переименовать экспорт. Получить вперед, не используя его.

  • Вы создали свой код для цели x64. Поскольку у него есть только одно соглашение о вызовах, компилятор проигнорирует ваш атрибут __stdcall и не будет украшать имя. Теперь вы бы необходимость файл .def для переименования экспорта. Никогда не делайте этого, никто не будет ожидать, что украшение будет использоваться в 64-битном коде.

Обратите внимание, что в случае оформления экспортируемое имя будет _DoSomething @ 4. Часть имени @ указывает размер кадра активации стека. Другими словами, количество байтов, которое нужно вытолкнуть из стека перед возвратом функции. Он никогда не может быть 1 для 32-битного кода, он всегда кратен 4. Это оформление имени существует, потому что __stdcall настолько опасен, что функция, выталкивающая больше или меньше стека, чем ожидалось, очень трудно диагностирует дисбаланс стека. Компоновщик ловит ошибку объявления прототипа функции.

5

Другие решения

для прекращения изменения имени процедуры, которую вы используете __stdcall до:
если вы используете компилятор GNU C ++ добавить «-Wl,--kill-atmsgstr «параметр для вашего компоновщика.

если вы используете кодовые блоки:

"Settings" -> "Compiler...""Global compiler settings""Linker settings""Other linker options":
add: "-Wl,--kill-at"

если вы используете devc ++

project->project options
Parameters
add "-Wl,--kill-at" to linker
0