一、 获取当前程序所在路径
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;
}
//先获得原先的实例的句柄 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));
....
}