C++ GetModuleHandleEx在csrsrv.dll上失败
在我当前的项目中,我需要从ntdll.dll和csrsrv.dll导出一些函数 获取ntdll句柄和函数指针没有问题。但当我尝试获取csrsrv.dll的句柄时,函数失败,错误代码为“未找到文件”。我试图指定文件的完整路径,但它没有改变任何事情 从dll函数加载函数的代码:C++ GetModuleHandleEx在csrsrv.dll上失败,c++,winapi,C++,Winapi,在我当前的项目中,我需要从ntdll.dll和csrsrv.dll导出一些函数 获取ntdll句柄和函数指针没有问题。但当我尝试获取csrsrv.dll的句柄时,函数失败,错误代码为“未找到文件”。我试图指定文件的完整路径,但它没有改变任何事情 从dll函数加载函数的代码: PVOID GetFunctionFromDll(const std::string& _sModuleName,const std::string& _sFnName) { HMODULE hMod
PVOID GetFunctionFromDll(const std::string& _sModuleName,const std::string& _sFnName)
{
HMODULE hModule = NULL;
PVOID ptrFn = NULL;
if(!GetModuleHandleEx(0,_sModuleName.c_str(),&hModule))
{
return 0;
}
ptrFn = GetProcAddress(hModule, _sFnName.c_str());
FreeLibrary(hModule); // preventing handle leakage
return ptrFn;
}
知道为什么csrsrv.dll会失败吗?不会加载dll。从链接的参考页:
检索指定模块的模块句柄并增加模块的引用计数,除非指定了GET\u module\u handle\u EX\u FLAG\u UNCHANGED\u REFCOUNT调用进程必须已加载模块。
调用时,csrsrv.dll
不得位于内存中,ntdll.dll
将位于内存中,并且调用成功
建议在函数外部使用,以确保DLL在函数调用之后仍保留在内存中,从而确保
GetFunctionFromDll()
返回的地址保持有效。实际上,它只是没有加载到内存中。感谢您指出我在文档中遗漏的句子