1. 程式人生 > >在動態庫內部獲取動態庫路徑

在動態庫內部獲取動態庫路徑

由於工作中經常與動態庫打交道,後來要用到動態庫自身當前路徑,找了好些資料,都沒有太好的,其中一個就是與動態庫名字無關的,就是在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);

這樣也能獲取到,方法應該有很多,但是限於知識積累,目前能寫上去的就這麼多了,最後這個是後加的~~