2014-01-27 5 views
4

Я хочу знать, если это возможно, используя C и WindowsAPI, если есть функция, которая получит мне 32-битный (я думаю) адрес памяти функции в dll , Например. Как получить 32-битный адрес $ xxxxxxxx Beep() в файле kernel32.dll. Во-вторых, если я использую адрес памяти вместо имени функции в сборке, могу ли я избежать связывания. НапримерПолучение адреса памяти функции DLL

mov eax, $xxxxxxxx 

вместо

mov eax, Beep 

ответ

2

Эта программа напечатает адрес Beep в kernel32:

#include <windows.h> 
#include <stdio.h> 

int main(void) 
{ 
    HMODULE hMod = GetModuleHandle("kernel32.dll"); 
    void* fn = GetProcAddress(hMod, "Beep"); 
    printf("%p", fn); 
} 

я пропустил ошибку проверки для простоты. В реальной программе вы бы этого не сделали.

2

Да. Посмотрите «GetProcAddress» на MSDN.

+1

IMO, это самый правильный способ избежать статической связи. Это стандартный способ для «старых» приложений получать доступ к новым функциям ОС, не связывая их с новыми библиотеками API OS. – user1793036

Смежные вопросы