You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:50:24