windows下DLL库里如何获取动态库文件名称

    技术2023-05-28  20

    本文为博主原创文章,未经博主允许不得转载。(合作洽谈请联系QQ:1010316426)

    假如我们有一个DLL库为C://xyz//abc.dll 现在想在abc.dll库内部获取这个文件的名称。该dll库被一个叫做myapp.exe的程序调用。 一般会想到通过GetModuleFileName来获取库名称,但是其第一个参数HMODULE hModule无法知道。如果给hModule赋值为NULL,那么只能得到调用该DLL的myapp.exe的文件名称。所以不能直接使用这个API。

    windows给我们提供了另一个API可以获取到这个DLL库的hModule,即 GetModuleHandleEx。 该函数原型如下:

    WINBASEAPI BOOL WINAPI GetModuleHandleExA( _In_ DWORD dwFlags, _In_opt_ LPCSTR lpModuleName, _Out_ HMODULE* phModule );

    其中,第三个参数是输出参数,即我们想知道的hModule。第二个参数填写一个这个abc.dll库里面的函数名即可。 完整示例代码如下:

    string g_strFullPathName; string g_strFullPath; string g_strDllNameExt; string g_strDllName; int Init(/*some param*/);//动态库声明的API函数 void ParseModuleName() { char strFilePath[1024]; memset(strFilePath, 0, 1024); //::GetModuleFileName(NULL, strFilePath, 2048);//第一个参数如果提供NULL,只能得到创建进程的那个EXE文件的名称。 HMODULE hModule = NULL; ::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)&Init, //这是函数名,强转 &hModule); DWORD len = ::GetModuleFileName(hModule, strFilePath, 1024); g_strFullPathName = std::string(strFilePath); string::size_type iIndex = g_strFullPathName.find_last_of("\\"); if (iIndex != std::string::npos) { g_strFullPath = g_strFullPathName.substr(0, iIndex + 1); g_strDllNameExt = g_strFullPathName.substr(iIndex + 1, g_strFullPathName.length()); g_strDllName = g_strDllNameExt.substr(0, g_strDllNameExt.length() - 4); } }
    Processed: 0.015, SQL: 8