获得当前 程序(.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));

....  
  
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当出现无法定位程序输入点nw.dll的错误时,这通常是因为系统无法找到或加载所需的nw.dll文件。根据引用\[1\]中的描述,你可以尝试使用GetLastError()函数来获取更多关于加载dll文件失败的错误信息。另外,根据引用\[3\]中的说明,可执行文件在运行时会按照一定的路径搜索顺序来查找和调用dll文件。你可以检查以下几个位置来确保nw.dll文件存在并可被找到:可执行文件所在目录、进程当前目录、系统目录、Windows目录以及环境变量PATH中的目录。如果nw.dll文件确实存在于这些位置之一,但仍然无法定位程序输入点,那可能是由于版本不兼容或其他问题导致的。 #### 引用[.reference_title] - *1* [DLL 找不到指定的程序 过程分析](https://blog.csdn.net/weixin_34006965/article/details/89823972)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [node 多版本管理 nvm-window(适用win7 win10)](https://blog.csdn.net/xuelang532777032/article/details/128301982)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【QGIS】无法定位程序输入点~于动态链接库~上](https://blog.csdn.net/sunriver2000/article/details/116712179)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值