我是c ++的新手,即使我知道该文件存在,此代码也始终返回NULL:
HMODULE hModule = GetModuleHandle(TEXT("C:\\Users\\Steve\\Desktop\\stub.exe"));
有趣的是,如果我将stub.exe复制到C:\ Windows \ system32,它会找到包含以下代码的模块:
HMODULE hModule = GetModuleHandle(TEXT("stub.exe"));
我错过了一些非常基本的东西吗?
答案 0 :(得分:7)
您只能在GetModuleHandle(L"C:\\Users\\Steve\\Desktop\\stub.exe");
运行时致电C:\Users\Steve\Desktop\stub.exe
。
但一般情况下,您不会为您的EXE名称调用GetModuleHandle
。由于每个进程只有一个EXE,因此只需调用GetModuleHandle(0)
即可。
答案 1 :(得分:3)
首先,GetModuleHandle
要求您事先将dll加载到进程中。
Windows具有用于搜索模块的特定路径,以及一些强制“安全”dll加载的开关,如果您希望扩展,可能需要查看SetDllDirectory
和AddDllDirectory
搜索的位置。有关Windows如何搜索二进制文件的说明,请参阅this。
答案 2 :(得分:0)
以下是MSDN的引用:
GetModuleHandle函数
检索指定模块的模块句柄。该模块必须已由调用进程加载。
这意味着您必须先使用LoadLibrary加载模块。 System32可能会得到特殊处理,但你真的不应该在那里复制任何东西。该文件夹严格用于操作系统的使用。