“当前目录”以及DLL搜索路径的问题

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值