在开发软件时,碰到了有一大批的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):
- The directory from which the application loaded.
- The current directory.
- The system directory. Use the GetSystemDirectory function to get the path of this directory.
- The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.
- The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
- 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