在C ++中,如果您尝试获取Windows API函数的函数指针,则该指针指向您在该函数的名称及其相应模块上使用GetProcAddress
时将获得的相同地址。例如:
&MessageBoxA == GetProcAddress("User32.dll", "MessageBoxA");
将是true
。但是,在Delphi中,情况并非如此。这段代码:
@MessageBoxA = GetProcAddress('User32.dll', 'MessageBoxA');
不是true
,在我的测试中,@MessageBoxA
是0x0040bd18
,而等效的GetProcAdress
返回了测试的C ++对应的内容,0x7550fd1e
。
现在我的问题是:为什么?
答案 0 :(得分:6)
带有0x004的地址..是导入的api函数声明的地址(在windows.pas
MessageBoxA
中)statically loaded,因此它当然会驻留在可执行映像中(默认情况下,其基址为0x00400000)。调用的实际函数是加载到该函数的内存中的库的图像。您可以使用GetModuleHandle
获取库的图像库。在你的情况下,它可能是0x75的东西......使用C ++测试,你可能正在链接运行时库,所以无论如何都要动态加载函数。