在動態庫內部獲取動態庫路徑
由於工作中經常與動態庫打交道,後來要用到動態庫自身當前路徑,找了好些資料,都沒有太好的,其中一個就是與動態庫名字無關的,就是在DllMain中獲取,如下:
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
}
else if (dwReason == DLL_PROCESS_DETACH)
{
CString szPath;
GetModuleFileName((HMODULE)hInstance,szPath.GetBuffer(MAX_PATH),MAX_PATH); //獲取路徑函式
MessageBox(NULL,szPath,"",MB_OK);
szPath.ReleaseBuffer();
}
else if (dwReason == DLL_THREAD_DETACH)
{
AFX_MANAGE_STATE(&afxModuleState);
}
return TRUE;
}
由於DllMain是一個獨立的程序,其他程序需要用到它的控制代碼或變數比較麻煩(程序間控制代碼拷貝可以實現),不易操作,今天在看Windows核心程式設計的時候看到可以用GetModuleHandle來獲取模組控制代碼,就嘗試了下面的方法結果就真獲取到了動態庫當前路徑,獲取程式碼如下:
HANDLE hDllhandle=GetModuleHandle("當前動態庫名");//獲取當前模組控制代碼
if (hDllhandle==NULL)
{
MessageBox(NULL,"獲取動態庫控制代碼失敗","",MB_OK);
}
char buff[MAX_PATH];
memset(buff,0,MAX_PATH);
GetModuleFileName((HMODULE)hDllhandle,buff,MAX_PATH);//獲取當前模組控制代碼路徑
MessageBox(NULL,buff,"動態庫路徑",MB_OK);
注:如果GetModuleHandle返回值為空,將獲取呼叫動態庫的程式的當前路徑
詳細內容可以檢視“Windows核心程式設計”第四章 4.1.1程序的例項控制代碼
第一個方法不需要提供動態庫的名字,但是適用範圍受到程序的限制,而後一種方法需要提供動態庫模組名,但是不受程序間限制
char buff[MAX_PATH];
memset(buff,0,MAX_PATH);
GetModuleFileName(theApp.m_hInstance,buff,MAX_PATH);
這樣也能獲取到,方法應該有很多,但是限於知識積累,目前能寫上去的就這麼多了,最後這個是後加的~~