Winapi 将编辑控件值与字符串进行比较

Winapi 将编辑控件值与字符串进行比较,winapi,visual-c++,Winapi,Visual C++,我在对话框中有两个编辑控件。单击Ok按钮,我想将这个值与字符串进行比较 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]; GetDlgItemTe

我在对话框中有两个编辑控件。单击Ok按钮,我想将这个值与字符串进行比较

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,但是它说不能将
contchar
转换为
tchar
如何转换此值。

重要的细节在注释中泄漏出来。这太糟糕了——细节应该出现在问题中。特别是,您至少应该显示执行比较并导致编译器错误的代码行。编译器错误应该被逐字记录

也就是说,看起来您正在使用
wcscmp
\u tcscmp
执行比较。但是您要传递的是
szBuf
,对于一个参数,它是一个宽字符串;对于另一个参数,它是一个类似于
“hello”
的文本。问题是
szBuf
是一个宽字符串,文本是8位的
const char*

我假设您已经编写了以下代码:

int cmp = _tcscmp(szBuf, "Hello");
和编译器对象,因为您已经定义了UNICODE条件,所以
\u tcscmp
希望这两个参数的类型都是
const wchar\u t*
。文字不是,而是
const char*

因此,简单的解决方案是使用广泛的文字:

int cmp = _tcscmp(szBuf, _T("Hello"));
也就是说,我不建议在这个时代使用
TCHAR
。我认为你不太可能仍然以Windows98为目标。坚持使用Windows原生Unicode API并使用宽字符串。按如下方式声明缓冲区:

wchar_t szBuf[BUFF_LEN];
int cmp = wcscmp(szBuf, L"Hello");
比较如下:

wchar_t szBuf[BUFF_LEN];
int cmp = wcscmp(szBuf, L"Hello");
这样做,你就更容易理解你在做什么。如果总是使用定义的
UNICODE
进行编译,则使用
TCHAR
是一个毫无意义的练习,只会导致代码模糊


最好还是尽量避免C字符串,并使用本机C++字符串。例如,

std::wstring
将是这里显而易见的选择。很明显,你需要使用C字符串来调用低级别的Windows API调用,但是一旦它们返回一个值,将其转换为C++字符串,生命就简单多了。为什么要用代码声明?请用有效代码回复您的问题。现在表决一个旗舰问题。还可以使用lstrcmp(i)来比较字符串。为什么要使用
TCHAR
。使用
wchar\u t
wstring
@DavidHeffernan-thanx这是个好主意。我想检查szBuf值是否等于字符串并说“你好”。是否可以比较整个字符串一次,或者需要使用循环检查每个字符wcscmp(szBuf,L“Hello”)给出正确的答案,但是如果我们将Hello存储在wchar_t temp=L“Hello”中,现在使用wcscmp(szBuf,temp)进行比较,它会给出答案0有什么问题吗?嗯,第一个字符串是Hello,第二个字符串是Hello。注意第二个字母中没有大写字母。它甚至不适用于Hello。你是指
wchar\u t temp=L“Hello”
还是
const wchar\u t*temp=L“Hello”
?嗯,文档上是这么说的。。。。。。