【发布时间】:2017-05-30 18:49:43
【问题描述】:
我刚刚回到编程 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 的方法。
希望这不会令人困惑,但我还有一些事情要做。如果我的措辞不完美,请耐心等待。
提前致谢。
【问题讨论】:
-
请重新阅读stackoverflow.com/tour... SO 是针对具体的编程问题,任何类型的建议都是题外话。作为旁注:选择其他语言(即 C#,因为您已经在使用 VS)或至少更现代的 C++ 库将使查找帮助变得更加容易......
-
在过去的 20 年里发生了很多变化。 .. 是的,更深奥的方法会导致缓冲区溢出 :)
-
从这里开始:unicode.org/standard/principles.html 注意“代码点”以及将它们编码为多字节的 UTF-X 方式。
-
顺便说一句,
GetBuffer()是错误的成员函数,如果您只需要一个指向字符串对象的非可变缓冲区的指针。你应该改用CString::GetString()。 -
谢谢;我不知道 GetString() 存在(因为它当时不存在)。我已经阅读了一些关于它的内容,并看到它是在中实现的