我在理解和让它正常工作方面遇到了疯狂的困难。基本上归结为我无法成功初始化这种类型的变量。它需要有 say 的内容7&2E25DC9D&0&USB003
。
任何人都可以解释/显示具有类似值的这种类型的正确初始化吗?我查看了该站点上的所有帮助,将我的项目属性从 unicode 更改为 multibyte 并没有解决问题,其他解决方案也对我不起作用。
在我的代码中,这是我开始初始化的方式:
LPCTSTR portvalue = new TCHAR[100];
正如您似乎已经收集到的,LPCTSTR
并且TCHAR
基本上定义如下(LPCTSTR
将被读取为指向常量的长指针TCHAR
):
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif // _UNICODE
typedef const TCHAR* LPCTSTR;
因此,您可以像初始化LPCTSTR
变量const wchar_t*
或变量一样初始化const char*
变量,例如对于 unicode:
LPCTSTR lpszUnicode = L"Test String";
对于 ASCII/多字节:
LPCTSTR lpszMultibyte = "Test String";
_T("x")
但是,在使用 WinAPI:和时,有一些有用的宏TEXT("x")
,它们都可以扩展为L"x"
(如果您的项目设置为 Unicode)或"x"
(如果您的项目属性设置为多字节)。因此,例如,您可以使用:
LPCTSTR lpszTest = _T("Test String");
LPCTSTR lpszTest2 = TEXT("Test String 2");
这将在 unicode 或多字节项目设置下编译。至于为什么有多个宏扩展到同一个东西,请查看这篇博文。
您还可以通过动态分配内存来完成您正在做的事情,例如:
LPTSTR lpszDynamic = new TCHAR[100];
// Do something with lpszDynamic
delete[] lpszDynamic;
但是,如果您发现自己经常像这样动态分配内存,最好使用字符串类,例如CString
or std::string
/ std::wstring
(我的 MFC/WinAPI 项目中经常有以下内容):
namespace std {
#ifdef _UNICODE
typedef wstring tstring;
#else
typedef string tstring;
#endif // _UNICODE
};
From this answer, you have to prefix the literal with L
LPCWSTR a = L"TestWindow";
As Frederic pointed out, you can initialize a LPCTSTR
in this manner:
LPCTSTR s = _T("TestWindow");