LoadLibrary GetProcaddress 为什么这样工作

问题描述 投票:0回答:1

当我使用函数名称为“MessageBoxA”的 Visual Studio Code 运行此代码时,它确实有效,并且为我提供了指向该函数的指针。但是,当我将函数名称更改为“MessageBoxATEST”并保存时,它仍然为我提供相同的函数地址。这怎么可能(因为user32.dll中不存在这个函数)。例如,当我将 DLL 的名称更改为

User32TEST.dll
时,它会给出错误
Function not loaded .... 
,这是应该的。

有人可以帮忙吗?

#include <windows.h>
#include <stdio.h>

typedef BOOL(*func_pointer)(LPSTR, LPCSTR);
int main () {

HMODULE Handle_DLL = LoadLibrary("User32.dll");
func_pointer Pointer = (func_pointer)(Handle_DLL,"MessageBoxATEST");

if (Handle_DLL == NULL || Pointer == NULL){
DWORD error = GetLastError();
printf("Function not loaded into memory %d\n", error);
return 1;
}
else{
printf("Function address: %p\n", (void*)Pointer);
FreeLibrary(Handle_DLL);
return 0;
}}
c windows winapi loadlibrary getprocaddress
1个回答
0
投票

使用函数名称

"MessageBoxA"
它确实有效,并且它为我提供了指向该函数的指针

不,不是。

当我将函数名称更改为例如

"MessageBoxATEST"
并保存时,它仍然为我提供相同的函数地址

它从来都不是函数地址。

您忘记实际打电话

GetProcAddress
。您现在拥有的是(在考虑逗号运算符的行为之后)
(func_pointer)"MessageBoxATest"
,这显然不是 NULL 指针。

© www.soinside.com 2019 - 2024. All rights reserved.