Я работаю над проектом по созданию фиктивной 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, которую я эмулирую?
Есть только два способа не получить оформление имени __stdcall:
Вы должны использовать файл .def, чтобы переименовать экспорт. Получить вперед, не используя его.
Вы создали свой код для цели x64. Поскольку у него есть только одно соглашение о вызовах, компилятор проигнорирует ваш атрибут __stdcall и не будет украшать имя. Теперь вы бы необходимость файл .def для переименования экспорта. Никогда не делайте этого, никто не будет ожидать, что украшение будет использоваться в 64-битном коде.
Обратите внимание, что в случае оформления экспортируемое имя будет _DoSomething @ 4. Часть имени @ указывает размер кадра активации стека. Другими словами, количество байтов, которое нужно вытолкнуть из стека перед возвратом функции. Он никогда не может быть 1 для 32-битного кода, он всегда кратен 4. Это оформление имени существует, потому что __stdcall настолько опасен, что функция, выталкивающая больше или меньше стека, чем ожидалось, очень трудно диагностирует дисбаланс стека. Компоновщик ловит ошибку объявления прототипа функции.
для прекращения изменения имени процедуры, которую вы используете __stdcall до:
если вы используете компилятор GNU C ++ добавить «-Wl,--kill-at
msgstr «параметр для вашего компоновщика.
если вы используете кодовые блоки:
"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