Как Andreas H ответ сказал, что число после @
этого числа байт функции удаляет из стека до возврата из функции. Это означает, что должно быть легко определить это число, так как это также количество байт, которое вам нужно, нажимать на стек, чтобы правильно вызвать функцию. Это должно быть количество инструкций PUSH перед вызовом, умноженным на 4. В большинстве случаев это также будет количество аргументов, переданных функции, умноженной на 4.
Если вы хотите, чтобы перепроверить, что вы получили правильный номер, и у вас есть Microsoft Visual Studio установлена, вы можете найти декорированное имя символа из командной строки Developer, как это:
C:\> dumpbin /headers kernel32.lib | find "ExitProcess"
Symbol name : [email protected]
Name : ExitProcess
Если вы» повторно с помощью инструментов компилятора MinGW, чтобы связать код сборки, вы можете сделать это вместо того, чтобы:
C:\> nm C:\MinGW\lib\libkernel32.a | find "ExitProcess"
00000000 I [email protected]
00000000 T [email protected]
Вам нужно заменить C:\MinGW
с каталогом установлен MinGW.
Поскольку не все API Windows находятся в библиотеке импорта kernel32
, вам необходимо заменить kernel32
именем библиотеки импорта, указанной в документации Windows SDK для функции API, к которой вы хотите установить ссылку. Например, с MessageBoxA
вам нужно будет использовать user32.lib
с Visual Studio и libuser32.a
вместо MinGW.
Обратите внимание, что существует несколько редких API Windows, которые не используют соглашение о вызове stdcall
. Это такие функции, как wsprintf
, которые принимают переменное количество аргументов, которое не поддерживает соглашение о вызове stdcall
. Эти функции имеют только знак подчеркивания _
перед их именами, а не @
или номер после. Они также требуют, чтобы вызывающий объект удалял аргументы из стека.
Этот метод действительно работает. – hakeris1010