我需要获取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;
为什么返回的值不同?
答案 0 :(得分:12)
因为静态链接使用thunk跳转表来调用DLL函数。
示例中的 p2
是进程中FindWindowW
函数的正确地址,而p1
是此类跳转指令的地址
jmp dword ptr [SomeAddress]
其中SomeAddress
指向FindWindowW
函数的实际地址。