假如我們有一個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);
}
}