GetCurrentDirectory这个API用于获得进程的“当前目录”
GetModuleFileName获取一个已装载模板的完整路径名称
区别通过一个实验可以明显的看出
void CCurrentDirDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
char szCurrentDir[MAX_PATH] = {0};
GetCurrentDirectoryA(MAX_PATH, szCurrentDir);
MessageBox(szCurrentDir,"当前目录",MB_OK);
}
void CCurrentDirDlg::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
CFileDialog DLG(TRUE);
DLG.DoModal();
}
void CCurrentDirDlg::OnBnClickedButton3()
{
// TODO: Add your control notification handler code here
char szCurrentDir[MAX_PATH] = {0};
GetModuleFileName(NULL,szCurrentDir,MAX_PATH);
MessageBox(szCurrentDir,"当前目录",MB_OK);
}
上面的代码段有三个函数,第一个和第三个函数分别用GetCurrentDirectory和GetModeuleFileName获取当前路径并用MessageBox显示,第二个函数启动一个打开文件的对话框。现在exe程序放在E:\code\CurrentDir\Debug中。
实验一:
直接启动E:\code\CurrentDir\Debug\CurrentDir.exe,调用第一个函数,则MessageBox显示E:\code\CurrentDir\Debug;
调用第三个函数,则MessageBox显示E:\code\CurrentDir\Debug\CurrentDir.exe;
实验二:
在vs2005中使用调试或者不调试直接执行的方式启动,调用第一个函数,则MessageBox显示E:\code\CurrentDir\CurrentDir;
调用第三个函数,则MessageBox显示E:\code\CurrentDir\Debug\CurrentDir.exe;
实验三:
直接启动E:\code\CurrentDir\Debug\CurrentDir.exe,调用第二个函数,到F:随便打开一个文件,然后确定,
调用第一个函数,则MessageBox显示F:\
调用第三个函数,则MessageBox显示E:\code\CurrentDir\Debug\CurrentDir.exe;
实验四:
打开CMD,如下执行:
调用第一个函数,则MessageBox显示C:\Users\jensonzhang
调用第三个函数,则MessageBox显示E:\code\CurrentDir\Debug\CurrentDir.exe;
实验五:
打开CMD,如下执行:
调用第一个函数,则MessageBox显示E:\code\CurrentDir\Debug
调用第三个函数,则MessageBox显示E:\code\CurrentDir\Debug\CurrentDir.exe;
通过上面的实验,说明了两个问题:
1.GetCurrentDirectory得到的是一个文件夹的路径,GetModeuleFileName得到的是exe的完整路径
2.(更重要的)GetCurrentDirectory得到的是“当前目录”,而GetModeuleFileName得到的是exe所在目录的完整路径+exe文件名
“当前目录”是可变的,从上面实验可以看出,exe总是在E:\code\CurrentDir\Debug中被启动,但是“当前目录”却可以由于它的启动方式不同而不同,cmd启动、vs调试启动、甚至是程序中打开一个文件,都可以切换“当前目录”,因此一切通过GetCurrentDirectory来得到exe路径并期望它是固定不变的企图都将会是失败的,而且很难发现原因。
再说一下DLL的搜索路径问题(仅对Load非绝对路径的dll有效),可以看下微软的解释:
http://msdn.microsoft.com/en-us/library/ms682586%28VS.85%29.aspx
如果系统开启了“安全dll搜索”选项,则搜索顺序为:
1.exe所在路径(即GetModeuleFileName得到的路径去掉最后的文件名)
2.系统目录(可用过GetSystemDriectory获得)
3.16位系统目录
4.Windows目录(可通过GetWindowsDirectory获得)
5.当前目录(即GetCurrentDirectory获得)
6.PATH中设置的路径
如果没有开启“安全dll搜索”,则搜索顺序为:
1.exe所在路径(即GetModeuleFileName得到的路径去掉最后的文件名)
2.当前目录(即GetCurrentDirectory获得)
3.系统目录(可用过GetSystemDriectory获得)
4.16位系统目录
5.Windows目录(可通过GetWindowsDirectory获得)
6.PATH中设置的路径
可参看 http://apps.hi.baidu.com/share/detail/20531250