【问题标题】:initializing a LPCTSTR /LPCWSTR [duplicate]初始化 LPCTSTR /LPCWSTR [重复]
【发布时间】:2013-07-19 04:23:24
【问题描述】:

我很难理解并使其正常工作。基本上归结为我无法成功初始化这种类型的变量。它需要有7&2E25DC9D&0&USB003 的内容。

任何人都可以解释/显示这种类型的正确初始化和类似的值吗?我查看了该站点上的所有帮助,将我的项目属性从 unicode 更改为 multibyte 并不能解决问题,其他解决方案也不适合我。

在我的代码中,下面是我开始初始化的方式:

LPCTSTR portvalue = new TCHAR[100];

【问题讨论】:

  • 我建议坚持std::wstring
  • 或者,放弃LPCTSTR,直接使用CStringWstd::wstring
  • AFAICT,支持“Unicode”和“多字节”/“ASCII”编码的唯一原因是您希望您的代码在 Windows 3.0 上运行。如果您的代码仅在 WindowsNT3.1 和更高版本上运行,则更容易假设 _UNICODE 为真并在任何地方使用 wstring。
  • @MooingDuck 关于这一点,MFC 中的多字节支持实际上在 Microsoft Visual Studio 2013 及更高版本中已被弃用。

标签: c++ winapi


【解决方案1】:

如您所见,LPCTSTRTCHAR 基本上定义如下(LPCTSTR 将被读取指向常量TCHAR的长指针):

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif // _UNICODE

typedef const TCHAR* LPCTSTR;

因此,您可以像初始化 const wchar_t*const char* 变量一样初始化 LPCTSTR 变量,例如对于 unicode:

LPCTSTR lpszUnicode = L"Test String";

对于 ASCII/多字节:

LPCTSTR lpszMultibyte = "Test String";

但是,在使用 WinAPI 时有一些有用的宏:_T("x")TEXT("x"),它们都扩展为 L"x"(如果您的项目设置为 Unicode)或 "x"(如果您的项目属性设置对于多字节)。因此,例如,您可以使用:

LPCTSTR lpszTest = _T("Test String");
LPCTSTR lpszTest2 = TEXT("Test String 2");

这将在 unicode 或多字节项目设置下编译。至于为什么有多个宏扩展为同一个东西,请查看this blog post


你也可以通过动态分配内存来做你正在做的事情,例如:

LPTSTR lpszDynamic = new TCHAR[100];
// Do something with lpszDynamic
delete[] lpszDynamic;

但是,如果您发现自己经常像这样动态分配内存,最好使用字符串类,例如 CStringstd::string/std::wstring(我的 MFC/WinAPI 中经常有以下内容项目):

namespace std {
#ifdef _UNICODE
typedef wstring tstring;
#else
typedef string tstring;
#endif // _UNICODE
};

【讨论】:

  • 我很确定它是 UNICODE 用于 winapi 的东西,你不能将东西添加到 std,你可以只做 typedef std::basic_string<TCHAR> tstring;,但这仍然是一个坏主意,因为 @ 987654346@ 之类的东西是行不通的。我只使用std::wstring 并忘记了支持操作系统。
  • @chris 我只有一堆typedefd 和#defined 的东西,其中包括std::to_string(如std::to_tstring)等。但是是的,你可能是对的没有必要。
  • 相信我,我已经尝试过了(你可以在我在这里提出的问题中看到一些非常可怕的代码),这真的不值得。
  • 顺便说一句,this pageUNICODE
【解决方案2】:

this answer 开始,您必须在文字前面加上L

LPCWSTR a = L"TestWindow";

正如 Frederic 指出的那样,您可以通过这种方式初始化 LPCTSTR

LPCTSTR s = _T("TestWindow");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 2013-02-10
    • 2018-09-04
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2012-01-17
    相关资源
    最近更新 更多