在动态库内部获取动态库路径

由于工作中经常与动态库打交道,后来要用到动态库自身当前路径,找了好些资料,都没有太好的,其中一个就是与动态库名字无关的,就是在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进程的实例句柄

第一个方法不需要提供动态库的名字,但是适用范围受到进程的限制,而后一种方法需要提供动态库模块名,但是不受进程间限制

也可以利用全局变量theApp来获取当前路径,这是在http://topic.csdn.net/t/20040824/15/3304791.html里看到的

char buff[MAX_PATH];
 memset(buff,0,MAX_PATH);
 GetModuleFileName(theApp.m_hInstance,buff,MAX_PATH);

这样也能获取到,方法应该有很多,但是限于知识积累,目前能写上去的就这么多了,最后这个是后加的~~

你可能感兴趣的:(C/C++)