Skip to main content
 首页 » 编程设计

delphi之Delphi 和 C++ WinAPI 函数的地址在不应该不同的情况下不同

2024年12月31日16lexus

在 C++ 中,如果您尝试获取 Windows API 函数的函数指针,则该指针指向的地址与您在该函数名称上使用 GetProcAddress 时获得的地址相同,并且它各自模块。例如:

&MessageBoxA == GetProcAddress("User32.dll", "MessageBoxA"); 

将为true。然而,在Delphi中,情况并非如此。这段代码:

@MessageBoxA = GetProcAddress('User32.dll', 'MessageBoxA'); 

不会true,在我的测试中,@MessageBoxA0x0040bd18,而等效的 >GetProcAdress 返回测试的 C++ 对应部分执行的操作,0x7550fd1e

现在我的问题是:为什么?

请您参考如下方法:

带有 0x004.. 的地址是导入的 api 函数的声明地址(在 windows.pas 中的 MessageBoxA 中),使其具有 statically loaded ,因此它当然会驻留在可执行镜像中(默认情况下其基地址为 0x00400000)。实际调用的函数位于加载到该函数所在内存的库镜像中。您可以使用 GetModuleHandle 获取库的镜像库。在您的情况下,它可能是 0x75 的内容...通过 C++ 测试,您可能会链接到运行时库,因此该函数无论如何都会动态加载。