我刚刚回到Programming C ++,MFC,Unicode。在过去的20年里,很多都发生了变化。
另一个项目的代码编译得很好,但是当我把它粘贴到我的代码中时出错了。我花了1-1 / 2天的时间来解决下面的函数调用:
enter code here
CString CFileOperation::ChangeFileName(CString sFileName)
{
char drive[MAX_PATH], dir[MAX_PATH], name[MAX_PATH], ext[MAX_PATH];
_splitpath_s(sFileName, drive, dir, name, ext); //error
------- other code
}
在阅读帮助后,我更改了CString sFileName以使用强制转换:
enter code here
_splitpath_s((LPTCSTR)sFileName, drive, dir, name, ext); //error
这也造成了错误。所以我使用的GetBuffer()与上面的相同。
enter code here
char* s = sFileName.GetBuffer(300);
_splitpath_s(s, drive, dir, name, ext); //same error for the 3rd time
sFileName.ReleaseBuffer();
此时我非常沮丧,但终于意识到我需要将CString更改为Ascii(我认为因为我设置为Unicode)。
因此;
enter code here
CT2A strAscii(sFileName); //convert CString to ascii, for splitpath()
然后在函数_splitpath_s()
中使用strAscii.m_pz这终于奏效了。所以在这之后,为了简短起见,我需要帮助关注: 1. Unicode vs Mulit-Byte(库调用) 2.要使用的变量
我愿意购买另一本书,请推荐。 另外,有没有办法在VS2015上过滤我的帮助,这样当我在一个变量上并按下F1时,它只能为我提供Unicode帮助以及将旧代码转换为unicode或将Mylti-Byte转换为Unicode的方法。
希望这不是混乱,但我有一些赶上来做。如果我的措辞不完美,请耐心等待。
提前致谢。
答案 0 :(得分:3)
documentation of _splitpath
列出了Unicode(wchar_t
)版本_wsplitpath
。这是你应该使用的那个。不要转换为ASCII或Windows ANSI,这通常会丢失信息,并且在重新组合时不会生成有效路径。
现代Windows编程基于Unicode。
Visual Studio C ++项目默认情况下是基于Unicode的,特别是它定义了宏符号UNICODE
,它影响<windows.h>
的声明。
答案 1 :(得分:1)
所有受支持的Windows版本都在内部使用Unicode,您的应用程序也应如此。 Windows使用UTF-16编码。
要使您的应用程序启用Unicode,您需要执行以下步骤:
wchar_t
(代替char
或TCHAR
)代替字符串。L"..."
代替"..."
)。CStringW
(代替CStringA
或CString
)。wcslen
代替strlen
或_tcslen
)。CreateWindowExW
代替CreateWindowExA
或CreateWindowEx
)。答案 2 :(得分:0)
尝试使用_tsplitpath_s
和TCHAR
。
所以最终的代码看起来像是:
CString CFileOperation::ChangeFileName(CString sFileName)
{
TCHAR drive[MAX_PATH], dir[MAX_PATH], name[MAX_PATH], ext[MAX_PATH];
_tsplitpath_s(sFileName, drive, dir, name, ext); //error
------- other code
}
这将使C ++编译器在构建期间使用正确的字符宽度,具体取决于项目设置