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