获得当前 程序(.exe) 以及 动态库(.dll) 所在路径


一、 获取当前程序所在路径

BOOL CLicenseCtrlDlg::GetAppPath(void)
{
	CString strAppPath;  // 保存结果
	TCHAR szModuleFileName[MAX_PATH]; // 全路径名
	TCHAR drive[_MAX_DRIVE];  // 盘符名称,比如说C盘啊,D盘啊
	TCHAR dir[_MAX_DIR]; // 目录
	TCHAR fname[_MAX_FNAME];  // 进程名字
	TCHAR ext[_MAX_EXT]; //后缀,一般为exe或者是dll
	if (NULL == GetModuleFileName(NULL, szModuleFileName, MAX_PATH)) //获得当前进程的文件路径
	{
		AfxMessageBox("获取安装路径失败!");
		return FALSE;
	}
	_tsplitpath( szModuleFileName, drive, dir, fname, ext );  //分割该路径,得到盘符,目录,文件名,后缀名
	m_ConfigPath = drive;
	m_ConfigPath += dir;
	return TRUE;
}


二、获取当前程序所调用的test.dll动态库所在路径

//先获得原先的实例的句柄
HINSTANCE exe_hInstance = ::GetModuleHandle(NULL);
//获得要新dll的句柄
HINSTANCE dll_hInstance = ::GetModuleHandle(_T("PSDLib.dll"));
//使用新句柄替换当前
AfxSetResourceHandle(dll_hInstance);
//处理完之后恢复
AfxSetResourceHandle(exe_hInstance);

在“ 获取当前程序所在路径”方法中调用

GetModuleFileName(NULL, szModuleFileName, MAX_PATH))

时第一个参数选择dll_hinstance,即可获得动态库的路径


三、有两个动态库A与B,A动态调用了B,不通过从A向B传递参数的方法,如何在B中取得A的路径


------解决方案--------------------
GetModuleHandle("A")取得动态库A的handle,然后调用GetModuleFileName(A的handle, lpFileName, nSize)即可 
------解决方案--------------------
GetModuleFileName(),传递A的句柄进去,可以得到它的模块路径 
------解决方案--------------------
根据你的被呼叫的函数,计算出函数的返回地址,也就是说函数在呼叫之前,
呼叫方压入堆栈的返回地址。
根据这个地址获取其所在的 DLL 模块句柄。
根据这个 DLL 句柄 获取其完整路径。 
------解决方案--------------------
B.dll


#ifdef __cplusplus
extern "C"
#endif
void * _ReturnAddress(void);
#pragma intrinsic(_ReturnAddress)

int funB()
{
HMODULE hCaller = NULL; 
TCHAR szModuleName[MAX_PATH]; 
void *pRetAddr = _ReturnAddress(); 
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)pRetAddr, &hCaller);  
GetModuleFileName(hCaller, szModuleName, _countof(szModuleName));

....  
  
}



你可能感兴趣的:(获得当前 程序(.exe) 以及 动态库(.dll) 所在路径)