Delphi和C ++的地址WinAPI函数不同时会有所不同

时间:2011-02-28 01:13:58

标签: delphi winapi delphi-2010 getprocaddress

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

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

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

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

不是true,在我的测试中,@MessageBoxA0x0040bd18,而等效的GetProcAdress返回了测试的C ++对应的内容,0x7550fd1e

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

1 个答案:

答案 0 :(得分:6)

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