GetModuleHandleW/A调用异常:除空字符串外均返回NULL的问题排查
问题排查与解决方法
1. 编码不匹配导致GetModuleHandleW调用失败
你用scanf("%s", prog)读取的是ANSI编码的char字符串,却直接强制转换成LPCWSTR传给宽字符版本的GetModuleHandleW,这会导致编码混乱,系统无法识别模块名称,因此返回NULL。
解决方式二选一:
- 改用ANSI版本的API,保持字符串类型一致:
HMODULE hModule = GetModuleHandleA(prog); - 切换为宽字符输入流程:
wchar_t prog[300]; wprintf(L"Enter name of program.\n"); wscanf(L"%s", prog); HMODULE hModule = GetModuleHandleW(prog);
2. GetModuleHandle的使用局限
GetModuleHandle系列函数只能获取当前进程空间内已加载的模块,如果你想获取其他运行进程的DLL模块,这个函数完全不适用。要实现目标,需要走以下流程:
- 调用
OpenProcess获取目标进程句柄(需申请PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限) - 用
EnumProcessModules枚举目标进程中所有已加载的模块句柄 - 通过
GetModuleFileNameEx获取每个模块的路径或名称 - 读取模块的PE结构解析导入函数信息
3. 代码中的其他潜在问题
IMAGE_OPTIONAL_HEADER类型错误:不能直接拷贝结构体,应该用指针访问,否则后续读取DataDirectory会出错,修正为:IMAGE_OPTIONAL_HEADER* pOPH = &pNTH->OptionalHeader; IMAGE_DATA_DIRECTORY* pIDD = pOPH->DataDirectory;- 输入提示的换行符写法错误:原代码中
printf的换行应该写在引号内,改为printf("Enter name of program.\n"); - 错误信息应补充错误码:用
GetLastError()获取具体错误码,方便排查问题:printf("Error: %lu\n", GetLastError());
内容的提问来源于stack exchange,提问作者Chad Krasher
相关产品推荐
相关产品推荐

