由于工作中经常与动态库打交道,后来要用到动态库自身当前路径,找了好些资料,都没有太好的,其中一个就是与动态库名字无关的,就是在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);
这样也能获取到,方法应该有很多,但是限于知识积累,目前能写上去的就这么多了,最后这个是后加的~~