windows下DLL庫裏如何獲取動態庫文件名稱

假如我們有一個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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章