引言
上一篇文章介绍了 SHGetSpecialFolderPath
该api用来获取指定的系统路径。
而 GetLongPathName
和GetShortPathName
函数分别用来将文件全路径字符串转换为不缩写的全路径和缩写的全路径字符串。
这两个函数极其重要!!!很多人写程序时不注意这一点——包括我,比如,使用GetModuleFileName
获取文件路径,我们一般都将获取到的路径直接拿来用。在99.9%的情况下,我们获取到的是没有缩写的全路径,但是,某些情况下,获取到的却是缩写的,例如,
C:\Prog~1\Comm~1\aaa~1.exe
如果这个时候,取进程的名称,将得到aaa~1.exe
,很明显,这种结果是我们所不愿意看到的,它会导致很严重的问题,而这种错误又是极其难以查找的。
所以,个人认为,在获取文件全路径后,都应该调用GetLongPathName
,以便保证得到的路径不是缩写形式。
0x01.GetLongPathName函数
DWORD WINAPI GetLongPathName(
LPCTSTR lpszShortPath,//指定的要转换的路径
LPTSTR lpszLongPath, //接收长路径的缓冲区
DWORD cchBuffer //缓冲区长度
);
函数说明:
将指定的路径转化成长路径形式
返回值:
函数执行成功则返回lpszLongPath
接收的字符串长度,不包括空字符;如果lpszLongPath
长度太小,则函数返回接收长路径需要的缓冲区长度,包括空字符,因此如果返回值大于cchBuffer
,则应重新分配lpszLongPath
,使其长度足够容纳长路径;如果函数因为其他原因失败则返回0,可以通过GetLastError()
获取错误信息。
0x02.GetShortPathName函数
DWORD WINAPI GetShortPathName(
_In_ LPCTSTR lpszLongPath, //指定的要转换的路径
_Out_ LPTSTR lpszShortPath, //接收短路径形式的缓冲区
_In_ DWORD cchBuffer //缓冲区的长度
);
函数说明:
获取指定路径的短路径形式
返回值:
如果执行成功,则返回lpszShortPath
接收的字符串的长度,不包括空字符;如果lpszShortPath
长度太小,则返回lpszShortPath
接收短路径字符串需要的长度,包括空字符;如果其他原因导致失败,则返回0,通过GetLastError()
获取出错信息。
0x03.使用例子:
//...
long length = 0;
TCHAR* buffer = NULL;
// First obtain the size needed by passing NULL and 0.
length = GetShortPathName(lpszPath, NULL, 0);
if (length == 0)
ErrorExit(TEXT("GetShortPathName"));
// Dynamically allocate the correct size
// (terminating null char was included in length)
buffer = new TCHAR[length];
// Now simply call again using same long path.
length = GetShortPathName(lpszPath, buffer, length);
if (length == 0)
ErrorExit(TEXT("GetShortPathName"));
_tprintf(TEXT("long name = %s shortname = %s"), lpszPath, buffer);
delete [] buffer;
///...