C++ GetModuleHandleEx在csrsrv.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

在我当前的项目中,我需要从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会失败吗?

不会加载dll。从链接的参考页:

检索指定模块的模块句柄并增加模块的引用计数,除非指定了GET\u module\u handle\u EX\u FLAG\u UNCHANGED\u REFCOUNT调用进程必须已加载模块。

调用时,
csrsrv.dll
不得位于内存中,
ntdll.dll
将位于内存中,并且调用成功


建议在函数外部使用,以确保DLL在函数调用之后仍保留在内存中,从而确保
GetFunctionFromDll()
返回的地址保持有效。

实际上,它只是没有加载到内存中。感谢您指出我在文档中遗漏的句子