【问题标题】:When I run the C++ code, I always get Visual Studio error C2664当我运行 C++ 代码时,我总是得到 Visual Studio 错误 C2664
【发布时间】:2016-03-31 12:24:07
【问题描述】:

当我使用这段代码时

if (GetKeyNameText(Key << 16, NameBuffer, 127))
{
    KeyName = NameBuffer;
    GoodKeyName = true;
}

我收到以下错误

C2664 'int GetKeyNameTextW(LONG,LPWSTR,int)': 无法转换参数 2 从 'char [128]' 到 'LPWSTR'

NameBuffer 是这样说的:

错误:“char*”类型的参数与类型的参数不兼容 "LPWSTR"

有什么建议吗?

【问题讨论】:

标签: c++ c2664


【解决方案1】:

您定义了UNICODE,这意味着您的所有函数以及TCHARLPTSTR 都默认为 个字符(wchar_t)。

这意味着您不能在没有特别注意的情况下使用窄字符串(使用char)。

有一个简单的解决方案,那就是显式调用函数的窄字符版本:GetKeyNameTextA

另一种解决方案是停止使用char 并改为TCHAR 和相关类型,并将T 宏用于字符串文字。

您可能想了解更多关于 UNICODE in the Windows API 的信息。

【讨论】:

  • 嗯,LPWSTR 始终是 wchar_t*
  • @NathanOliver UNICODE 宏导致GetKeyNameText 成为GetKeyNameTextW 的别名(实际上是一个宏),它明确使用LPWSTR。如果您看到the GetKeyNameText reference,它使用LPTSTR,如果定义了UNICODE,则定义为LPWSTR(否则为窄字符LPSTR)。
  • 哦。我没有看到该函数实际上使用了LPTSTR。我刚刚从 Q 中看到了LPWSTR。顺便说一句,我不是反对者。
  • @NathanOliver 容易出错。 :) 哦,我尽量不担心(太多!)反对投票。如果有人认为我的回答不好,那么他们有权这样投票。 :)
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 2019-10-13
  • 2014-04-30
  • 1970-01-01
  • 2015-02-04
  • 2023-03-25
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多