使用SetEnvironmentVariable調整應用程式環境變數中的path設定

nscboy發表於2012-11-15

在開發軟體時,碰到了有一大批的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


相關文章