1.下面代码在多字节环境下是可以正常运行的
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
CString lpszPathName = FileDlg.GetNextPathName(pos);
_splitpath_s(lpszPathName , drive, _MAX_DRIVE,dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT);
2.在unicode环境下
_splitpath_s()会报错,lpszPathName 类型不符合
这是因为在多字节环境下CString是窄字符,通常是基于char*和charde
在unicode环境下CString是宽字符,通常是基于wchar_t * 或者 std::wstring来表示
_splitpath_s函数接收的是窄字符,所以才会报错,只需要将lpszPathName 改成窄字符即可
3.转换方法(在unicode下)
//宽字符转为窄字符
CString lpszPathName = FileDlg.GetNextPathName(pos);
int nLen = lpszPathName.GetLength() + 1; // 加1 为键入结束符号 '\0'
char* lpszMultiByte = new char[nLen];
WideCharToMultiByte(CP_UTF8, 0, lpszPathName.GetBuffer(), -1, lpszMultiByte, nLen, NULL, NULL);
_splitpath_s(lpszMultiByte, drive, _MAX_DRIVE,dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT);