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

时间:2021-10-27 23:18:06

在开发软件时,碰到了有一大批的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