为什么@运算符返回的地址与GetProcAddress函数返回的地址不同

时间:2013-12-06 02:20:53

标签: delphi winapi

我需要获取Win APi方法的地址(FindWindowW),我正在使用@运算符和GetProcAddress,但两者都返回不同的结果。

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 个答案:

答案 0 :(得分:12)

因为静态链接使用thunk跳转表来调用DLL函数。

示例中的

p2是进程中FindWindowW函数的正确地址,而p1是此类跳转指令的地址

jmp dword ptr [SomeAddress]

其中SomeAddress指向FindWindowW函数的实际地址。