2

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

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

将是true。但是,在 Delphi 中,情况并非如此。这段代码:

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

不会,在我的测试中,等价物返回测试的 C++ 对应物时,.true@MessageBoxA0x0040bd18GetProcAdress0x7550fd1e

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

4

1 回答 1

6

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

于 2011-02-28T02:30:06.123 回答