【问题标题】:Error : Cannot convert char to wchat_t*错误:无法将 char 转换为 wchar_t*
【发布时间】:2015-07-13 08:34:31
【问题描述】:

我正在尝试使用 GetForegroundWindow 和 GetWindowText 函数获取活动窗口标题,这是我的代码

HWND hwnd = GetForegroundWindow();
char wname[255];
GetWindowText(hwnd,wname,255);

每次我尝试构建项目时,都会收到此错误消息“错误:错误:无法将 char 转换为 wchat_t*”

我正在使用 c++builder xe7

那么,怎么了?

【问题讨论】:

  • 我想你会发现它是wchar_t,而不是 wchat_t

标签: c++ winapi c++builder-xe


【解决方案1】:

您正在调用GetWindowText()TCHAR 版本。在您的项目选项中,您将 "TCHAR maps to" 选项设置为wchar_t,因此GetWindowText() 映射到GetWindowTextW(),它采用wchar_t* 参数。这就是为什么不能传入char[] 缓冲区的原因。

所以,您需要:

  1. “TCHAR 映射到” 更改为 char,以便 GetWindowText() 映射到 GetWindowTextA()(同样会影响您的所有其他基于 TCHAR 的 API 函数调用)代码。仅在将旧的 Unicode 前代码迁移到 C++Builder 2009+ 时使用此方法。

  2. 将您的代码改为使用TCHAR

    TCHAR wname[255];
    GetWindowText(hwnd,wname,255);
    
  3. 更改您的代码以直接使用 GetWindowText() 的 Ansi 或 Unicode 版本:

    char wname[255];
    GetWindowTextA(hwnd,wname,255);
    

    wchar_t wname[255];
    GetWindowTextW(hwnd,wname,255);
    

【讨论】:

    【解决方案2】:

    您正在以 Unicode 感知模式构建应用程序; char 不够大,无法容纳 UTF-16 字符。类型系统会为您捕获此问题,从而使您免于很多潜在的麻烦。要么更改为 ASCII 模式(简单但不好的解决方案),切换到到处使用宽字符串(烦人的解决方案),要么使用提供的宏在编译时根据构建参数进行选择(更烦人但最正确的解决方案)。

    这是实现上述任一解决方案后这段代码 sn-p 的样子:

    HWND hwnd = GetForegroundWindow();
    wchar_t wname[255];
    GetWindowText(hwnd, wname, 255);
    
    HWND hwnd = GetForegroundWindow();
    TCHAR wname[255];
    GetWindowTextW(hwnd, wname, 255);
    

    如果您选择构建一个支持 Unicode 的应用程序(您应该这样做),您还必须记住在适用的情况下使用 wmain_tmain,而不是普通的无聊的 main。因为 Windows。

    【讨论】:

    • “最正确”的解决方案是到处使用 unicode。现在已经不是 1995 年了。
    • 绝对不是。如果他只是盲目地到处使用 Unicode,然后他或其他人切换了文本模式(想象移植到旧版 Windows,或者可能移植到新的 Unicode 标准,或者发明一个合理的理由),那么一切都会崩溃.宏很不方便,但它们比将选择硬编码到每个变量中更可取。
    • @JonathanPotter 最正确的是使用 UTF-8,因为 UTF-16 是支持系统硬编码 Unicode 1.0(1996 年之前)的 16 位代码点的过时折衷方案。 char 不暗示 ASCII;它是唯一有效的表示形式,世界其他地方都在使用 UTF-8。
    • @acwaters TCHAR 在您需要为 Win98 和 WinNT 构建时很有用。如果您不需要它,那么 TCHAR 会使您的代码非常难以阅读。
    • Win32 API 不支持 UTF-8。您必须将每个输入字符串从 UTF-8 转换为 UTF-16,并将每个输出字符串从 UTF-16 转换为 UTF-8。 Delphi/C++Builder 多年来一直这样做(但使用 Ansi 而不是 UTF-8)直到 2009 年 RTL/VCL 更改为使用 UTF-16 字符串。
    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多