我必须说我是win32 c ++编程的新手,所以我遇到了一个问题 某些代码在多字节字符集中编译,而不是在Unicode字符集中编译 我的代码怎么能同时支持? 例如,此NOT仅在Unicode中编译多字节,仅在MultiByte中编译注释向量:
//vector<char> str2(FullPathToExe.begin(), FullPathToExe.end());
vector<wchar_t> str2(FullPathToExe.begin(), FullPathToExe.end());
str2.push_back('\0');
if (!CreateProcess(NULL,
&str2[0],
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi))
答案 0 :(得分:6)
使用TCHAR
作为字符类型(例如std::vector<TCHAR>
),即:
如果定义
WCHAR
,则UNICODE
为CHAR
否则。此类型在WinNT.h中声明为 如下:
#ifdef UNICODE typedef WCHAR TCHAR; #else typedef char TCHAR; #endif
答案 1 :(得分:4)
除非您的应用程序必须支持Windows 95或Windows 95或更早版本的桌面版,否则您不必同时支持这两种方式。
如果您为当前桌面或服务器Windows编写,支持“Unicode”就足够了。去wchar_t
吧!
答案 2 :(得分:0)
您可以使用microsoft提供的宏/ typedef并添加自己的,以支持两者。
TCHAR -> typedef to char/wchar_t
_TEXT() -> creates a text constant either wide or multibyte _TEXT("hallo")
添加可能很有用,所以你可以使用String类而不是vector来进行文本操作:
#ifdef UNICODE
typedef std::wstring String;
#else
typedef std::string String;
#endif
答案 3 :(得分:0)
通过“Win32 C ++编程新手”,我假设您的意思是不使用您需要维护的“ANSI”字符串的现有大型程序。如果是这样,那么为什么想要来构建“ANSI”版本?只需使用wchar_t
。
vector<wchar_t> str2(FullPathToExe.begin(), FullPathToExe.end());
str2.push_back(L'\0'); // Note the prefix.
if (!CreateProcessW(NULL, // Note the W; explicit is better than implicit.
&str2[0],
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi))
如果您需要使用多字节字符串(例如,用于读取文件,或者与使用char
而不是wchar_t
的第三方库一起工作),请使用{{ 3}}和WideCharToMultiByte
。