windows现在具体有多少个获取路径的函数本人不清楚,今天暂时讲下上面提到的几个windows函数。
1.GetCurrentDirectory
DWORD GetCurrentDirectory(DWORDnBufferLength,
//sizeofdirectorybuffer
LPTSTRlpBuffer
//directorybuffer
);
|
函数功能
参数说明
返回值
2.GetModuleFileName,GetFullPathName
DWORD GetFullPathName(
LPCTSTR lpFileName, // file name
DWORD nBufferLength, // size of path buffer,建议取值为:MAX_PATH
LPTSTR lpBuffer, // path buffer
LPTSTR *lpFilePart // address of file name in path
);
功能说明
从一指定文件得到文件的路径
参数说明
LPCTSTR lpFileName, 指定文件的名字
DWORD nBufferLength,缓存区的大小
LPTSTR lpBuffer, 用于存放路径的缓存区
LPTSTR *lpFilePart 文件名的起始地址
DWORD WINAPI GetModuleFileName(
HMODULE hModule,
LPTSTR lpFileName,
DWORD nSize
);
GetModuleFileName(NULL,szText,MAX_PATH);//只有第一个参数为NULL,返回当前模块的PathName,否则返回对应dll路径
GetFullPathName("",MAX_PATH,szText,NULL);//根据第一个参数提供的文件名(可用相对路径,8.3格式)扩充到含驱动器和目录
GetModuleFileName 是取一个模块(exe,dll)在磁盘上的路径。
GetFullPathName 是把一个8.3格式(dos)的路径转换为长文件名格式。
3.GetCurrentDirectory()和GetMoudleFileName()区别
char* pCurrDir = new char[260];
::GetCurrentDirectory(260,pCurrDir);
delete pCurrDir;
char* pModuleDir = new char[260];
::GetModuleFileName(NULL,pModuleDir,260);
delete pModuleDir;
上面代码执行完成后(调试状态):
pCurrDir:"C:\\Users\\dell\\Desktop\\共享内存\\MySharedServer\\MySharedServer"
pModuleDir:"C:\\Users\\dell\\Desktop\\共享内存\\MySharedServer\\Debug\\MySharedServer.exe"
还记得上面看GetCurrentDirectory()函数的函数描述么?什么是当前进程的当前目录?
我自己写了一些代码进行测试,一般在一个进程空间内,这两个得到的地址区别在于“有没有***.exe”应用程序的名称,其他都是一致的,那么为什么有当前目录这个概念?
详解:
GetCurrentDirectory这个是函数原型,他是主要是作用是获取程序的当前目录,大部分指的是当前运行程序所在的运行目录。记得这个地方说的是大部分情况,不是所有,有些特殊的情况会返回时其他的路径。
LPSTR lpath("C:\\Users\\dell\\Desktop\\共享内存\\MySharedServer\\Debug\\MySharedServer.exe");
if( !CreateProcess( NULL,
lpath,
NULL,
NULL,
FALSE,//1.重点
0,
NULL,
NULL,
&m_ClientSI,
&m_ClientPI) )
{
ZeroMemory( &m_ClientSI, sizeof(m_ClientSI) );
m_ClientSI.cb = sizeof(m_ClientSI);
}
上面代码不要看字面意思,思路是:用client1进程创建子进程client2,而在client2进程中使用GetCurrentDirectory()和GetModuleFileName()两个函数,此时得出的结果是完全不一样的。
GetCurrentDirectory()得到的是client1客户端的运行目录,GetModuleFileName()得到的还是Client2.exe的应用程序目录。
//下面的一段代码主要是获得当前程序的运行目录(.exe)所在的目录
{
CString path;
GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
path = path.Left(pos);
}
后来查看了一些资料,微软也承认这个函数有时候不是那么恰当,他的这个获取的值收到很多的影响,所以如果只是为了获取当前程序运行路径,建议使用GetModuleFileName这个函数来处理,这个比较准,因为他获得是当前运行程序的存储路径。