VC获取应用程序路径

在项目中经常要用到配置文件或日志文件,而这些文件通常和应用程序放在同一目录中,所以必须得到当前执行应用程序的目录。

方法一:GetCurrentDirectory() 函数,其原型如下:

DWORD GetCurrentDirectory(

DWORD nBufferLength, // size of directory buffer

LPTSTR lpBuffer // directory buffer

);

该函数包含在”winbase.h”头文件中。

有网友反映,说GetCurrentDirectory()函数得到应用程序目录不安全,假设应用程序在“D:\test”目录下,当我们用了CFileDialog来打开一个文件,如“C:\test\1.txt”,此时再用该函数时得到的值将变为”C:\test”,但本人在VS2008上测试,其并没有改变。

测试代码如下:

void CdemoDlg::OnBnClickedButton1()
{
#define  DIR_LEN  100 

	char dir1[DIR_LEN];
	memset(dir1,0,DIR_LEN);
	GetCurrentDirectory(DIR_LEN,dir1);
	MessageBox(dir1,0,0);

	CString filePathName;
	CFileDialog fileDlg(true);
	char *filename;
	
	if (fileDlg.DoModal()==IDOK)
	{
		char dir2[DIR_LEN];

		memset(dir2,0,DIR_LEN);
		GetCurrentDirectory(DIR_LEN,dir2);
		MessageBox(dir2,0,0);

		filePathName = fileDlg.GetPathName();

		MessageBox(filePathName,0,0);

		filename = filePathName.GetBuffer(filePathName.GetLength());
	}
}

只贴了Button响应函数的代码。程序运行后界面如下:

当单击选择文件时,MessageBox输出如下:


单击确定,


单击打开时,MessageBox输出结果如下:


我们可以看到两次输出结果并没有改变。再点击确定时,输出:


这个就是我们打开的文件。

在使用CFileDialog时,我有时希望得到打开的文件的绝对路径,我们可以使用CFileDialog的成员函数GetPathName(),该函数的返回值是CString类型的,如若向转换为char字符串类型,可以使用CString的成员函数GetBuffer

第二种方法:GetModuleFileName()函数。该函数原型如下:

DWORD GetModuleFileName( HMODULE hModule,

LPTSTR lpFilename,DWORD nSize

);

函数参数说明:

hModule : 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。

lpFileName : 是你存放返回的名字的内存块的指针,是一个输出参数

nSize : 装载到缓冲区lpFileName的最大值

函数返回值:

如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所设的nSize过小,那么返回仅按所设置缓冲区大小返回相应字符串内容。

如果函数失败,返回值将为0,利用GetLastError可获得异常代码。

该函数包含在“Windows.h”头文件中。

将上面的代码中的GetCurrentDirectory()换为GetModuleFileName(),程序输出如下图,它输出应用程序的全路径了,包含应用程序名。


而我们在实际应用中往往只想知道它所在的目录,我们可以通过如下代码实现。

部分代码:

memset(dir1,0,DIR_LEN);
GetModuleFileName(NULL,dir1,DIR_LEN);
char *pDest = strrchr(dir1,'\\');
int nPos = pDest - dir1 + 1;
dir1[nPos] = 0;

MessageBox(dir1,0,0);

程序运行结果如下:


对于以上代码说明一点:函数strrchr(dir1,'\\')表示从右边开始找字符’\\’的位置返回找到一个该字符的地址,注意其中有一个’\’是转义用的。下一句代码nPos = pDest - dir1 + 1是两个地址相减。

本文下载地址http://www.kuaipan.cn/file/id_63913550065725685.htm




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值