GetModuleHandleEx 在 csrsrv.dll 上失败
GetModuleHandleEx fails on csrsrv.dll
在我目前的项目中,我需要一些从ntdll.dll和csrsrv.dll导出的函数。
获取 ntdll 的句柄和指向函数的指针没有问题。但是当我尝试获取csrsrv的句柄时.dll函数失败并显示错误代码"找不到文件"。我试图指定文件的完整路径,但它并没有改变任何事情。
从 dll 函数加载函数的代码:
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 中失败?
GetModuleHandleEx()
不加载 DLL。从链接的参考页面:
检索指定模块的模块句柄,并递增模块的引用计数,除非指定了GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT。模块必须已由调用进程加载。
进行调用时,csrsrv.dll
不得在内存中,并且ntdll.dll
将位于内存中,并且调用成功。
建议在函数外部使用LoadLibrary()
,以确保 DLL 在函数调用之后保留在内存中,从而保证 GetFunctionFromDll()
返回的地址仍然有效。
相关文章:
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 为什么 LoadLibrary 失败,而 LoadLibraryA 成功加载 DLL?
- 从 C#-DLL 调用函数的 C++ 失败
- 代码在 msvcrt .dll函数上设置断点失败
- 用户DLL/EXE中的堆分配失败
- DLL 注入不断失败,出现不一致的错误
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- Dll 注入 - LoadLibraryA 失败
- jvm.dll 上的加载库失败,错误代码为 183
- 库调用失败 c++ dll
- 无法在 Python 3.5 上导入 cv2 DLL 加载失败
- 如何查找 dll 注册失败的原因
- 添加新对话框后,MFC 应用程序启动失败并"DLL Initialization Failed"
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- 显式DLL 1函数失败
- 在Windows 7下可以从C#调用C DLL,但在Windows 10下失败
- 包装DLL-了解导入失败的原因
- 延迟加载opengl32.dll失败,出现Qt5
- 使用签证编译 dll / exe - 链接失败