使用SetEnvironmentVariable调整应用程序环境变量中的path设置

在处理需要大量DLL且存在隐式链接的软件开发中,由于不能将DLL放在系统目录或应用目录下,选择创建一个子目录MyDllPath来集中管理。通过GetEnvironmentVariable和SetEnvironmentVariable函数更新应用的PATH环境变量,将MyDllPath添加到当前路径,确保LoadLibrary能成功加载依赖的DLL。详细信息可参考MSDN相关文档。

在开发软件时,碰到了有一大批的dll需要加载,且这些dll中有隐式链接到其它dll情况.由于某些原因,不能将dll放入系统目录中也不能将他们放置在应用程序同一目录中.

为集中管理,将其放置到应用程序目录下的字目录MyDllPath目录下.

当使用LoadLibrary加载dll时会由于dll中存在隐式链接,且被链接的dll不在当前路径下(在MyDllPath路径下)而导致加载失败的情况.


这时,可以使用GetEnvironmentVariable/SetEnvironmentVariable来调整本应用程序的路径设定.将MyDllPath加载到本应用程序的当前路径中.这样即可正常加载所需要的dll了.

如下是修改当前应用程序目录路径的方法:

BOOL CDemoApp::SetCurrentEnvPath()
{
	char chBuf[0x8000]={0};
	DWORD dwSize =GetEnvironmentVariable("path",chBuf,0x10000);
	CString strEnvPaths(chBuf);

	// 将当前路径\dll路径添加到本进程的路径中
	if(!::GetModuleFileName(NULL,chBuf,MAX_PATH))
		return FALSE;
	CString strAppPath(chBuf);
	const int nPos = strAppPath.ReverseFind(_T('\\'));
	if(nPos>0){
		// 路径中包含最后的'\\'
		strAppPath = strAppPath.Mid(0,nPos+1);
	}

	strEnvPaths.TrimRight(";");
	strEnvPaths += ";" + strAppPath +"MyDllPath;";

	BOOL bRet = SetEnvironmentVariable("path",strEnvPaths);

	return bRet;
}

根据MSDN.应用程序在加载dll时,所搜索的路径如下( Windows 2000/NT):

  1. The directory from which the application loaded.
  2. The current directory.
  3. The system directory. Use the GetSystemDirectory function to get the path of this directory.
  4. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.
  5. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
  6. The directories that are listed in the PATH environment variable.

更详细的信息可以参考msdn  http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值