我需要获取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;
Run Code Online (Sandbox Code Playgroud)
为什么返回的值不同?
klu*_*udg 12
因为静态链接使用thunk跳转表来调用DLL函数.
p2在你的例子中是FindWindowW你进程中函数的正确地址,而这p1是一个像这样的跳转指令的地址
jmp dword ptr [SomeAddress]
Run Code Online (Sandbox Code Playgroud)
where SomeAddress指向FindWindowW函数的实际地址.