Как вы вызываете функции Win32 API из встроенного ассемблера? - PullRequest
2 голосов
/ 27 мая 2010

Кто-нибудь, пожалуйста, скажите мне, что не так с этим кодом Я просто вызываю функцию Sleep из kernel32.dll В чем дело? Я использую Visual Studio 2008. Любая помощь будет благодарна. Большое спасибо.

__asm
{
    mov eax, 77e2ef66h
    push 9999
    call eax
}

1 Ответ

6 голосов
/ 27 мая 2010

Где вы взяли это магическое число, 77e2ef66h? Обычно, если вы вызываете функции Win32 API из встроенного ассемблера, вы должны сделать что-то вроде:

__asm 
{ 
    push 9999 
    call Sleep
} 

Функции в Win32 не имеют фиксированного адреса (независимо от того, что может отображать ваш «DLL Export Viewer»). Функции связаны name или ordinal во время загрузки (загрузчиком Windows PE) и не расположены по фиксированным адресам. Фактически, фактический адрес функций может меняться между версиями Windows, подвыпусками в одной и той же версии Windows, с компьютера на компьютер и даже, возможно, от одного запуска вашей программы к следующему.

(Отказ от ответственности: с тех пор, как я это сделал, прошло очень много времени, поэтому детали приведенного выше примера кода, несомненно, неверны, но я знаю, что вам точно не нужно использовать магические числа.)

...