Почему адрес, возвращаемый оператором@, не совпадает с адресом, возвращаемым функцией GetProcAddress

мне нужно получить адрес метода APi Win (FindWindowW) , Я использую @ оператора и GetProcAddress но оба возвращает результаты differents.

var
  p1, p2 : Pointer;
begin
  p1:= @Winapi.Windows.FindWindowW;
  p2:=GetProcAddress(GetModuleHandle('user32.dll'), 'FindWindowW');
  ShowMessage(Format('p1 %p p2 %p ', [p1, p2]));
end;

Почему возвращаемые значения разные?

1 ответов


потому что статическое связывание использует таблицу перехода thunk для вызова функции DLL.

p2 в вашем примере правильный адрес FindWindowW функция в вашем процессе, пока p1 Это адрес инструкции прыжка, как это

jmp dword ptr [SomeAddress]

здесь SomeAddress указывает на фактический адрес