我在对话框中有2个编辑控件。然后单击Ok Button我想将此值与字符串进行比较。
case IDC_BUTTON1:
UINT WINAPI GetDlgItemText(
_In_ HWND hDlg,
_In_ int nIDDlgItem,
_Out_ LPTSTR lpString,
_In_ int nMaxCount
);
TCHAR szBuf[BUFF_LEN];
TCHAR szBuf1[BUFF_LEN];
GetDlgItemText(hDlg, IDC_EDIT1, szBuf, BUFF_LEN - 1);
GetDlgItemText(hDlg,IDC_EDIT2,szBuf1,BUFF_LEN-1);
现在之后,如果条件检查值szBuf和szBuf1,但它说无法将cont char
转换为tchar
如何转换此值。
答案 0 :(得分:1)
重要细节正在评论中泄露出来。这太糟糕了 - 细节应该出现在问题中。特别是你应该至少显示执行比较的代码行,这会导致编译器错误。并且应始终逐字转录编译器错误。
也就是说,看起来您正在使用wcscmp
或_tcscmp
来执行比较。但是你传递的szBuf
是一个参数的宽字符串,另一个是"hello"
的文字。问题是szBuf
是一个宽字符串,文字是8位,const char*
。
我假设你已经编写了这样的代码:
int cmp = _tcscmp(szBuf, "Hello");
编译器对象因为你已经定义了UNICODE条件,所以_tcscmp
要求两个参数都是const wchar_t*
类型。文字不是,const char*
。
所以简单的解决方案是使用宽文字:
int cmp = _tcscmp(szBuf, _T("Hello"));
那就是说,我不建议在这个时代使用TCHAR
。我认为你不太可能仍然以Windows 98为目标。坚持使用Windows原生Unicode API并使用宽字符串。像这样声明你的缓冲区:
wchar_t szBuf[BUFF_LEN];
并且比较如下:
int cmp = wcscmp(szBuf, L"Hello");
通过这种方式,您可以更轻松地了解您正在使用的内容。如果总是使用TCHAR
进行编译,那么使用UNICODE
是一个毫无意义的练习,只会导致代码混淆。
更好的是尽可能避免使用C字符串并使用本机C ++字符串。例如,std::wstring
将是明显的选择。显然,您需要将C字符串用于低级Windows API调用,但只要它们返回一个值,就将其传递给C ++字符串,生活将变得更加简单。