gpt4 book ai didi

c - winprog.org 第一个例子奇怪的行为?

转载 作者:太空宇宙 更新时间:2023-11-04 00:53:07 24 4
gpt4 key购买 nike

我说的是 winprog.org 关于 Windows GUI 的教程,因为 StackO 上的许多用户都推荐了它。

我基本上试过这个例子:

#include "stdafx.h"
#include "winapiTest1.h"


int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL, (LPCWSTR) "Goodbye, cruel world!", (LPCWSTR) "Note", MB_OK);
return 0;
}

但是当我运行它时,它会显示消息框,但其中的每个字符串(甚至标题)都以汉字表示。

似乎是什么问题?

最佳答案

But when I run it, it shows the message box but every string in it (even the title) is represented in Chinese characters.

原因是因为操作系统正在解释您的字符串文字,就好像它们是使用 UTF-16 编码的一样,即使他们不是。

MessageBox() 等标识符有两种形式:MessageBoxA() 函数和 MessageBoxW()MessageBoxA() 是接受以当前代码页编码的字符串的“ANSI”版本,MessageBoxW() 是接受以 UTF- 编码的字符串的“宽”版本16(即它是“Unicode-aware”)。 MessageBox() 实际上是一个宏,它根据是否定义了 UNICODE 宏来定义其中之一。 Windows API 中没有名为 MessageBox() 本身 的实际函数。

问题的症结就在这里:

MessageBox(NULL, (LPCWSTR) "Goodbye, cruel world!", (LPCWSTR) "Note", MB_OK); 

您的项目可能在某处有一个#define UNICODE,导致MessageBox() 标识符解析为MessageBoxW(),它需要一个UTF-16 编码的字符串。通常情况下,编译器会向您提示(即编译错误),但 LPCWSTR 转换实际上关闭了编译器并强制其编译。

您不能只是随机 throw 并总是期望它起作用。不幸的是,许多 Windows API 教程(以及一些一般的 C++ 教程)在没有必要甚至不合适的情况下到处滥用强制转换。

solution that James propose使用 _T() 宏,这有助于设置它以便正确编码字符串文字,而无需强制转换。然而,对于新应用程序来说,一个更好的解决方案是忘记函数的 ANSI 版本,并一直在 Unicode 中工作。 _T() 宏是应用程序过渡到支持 Unicode 的 API 的权宜之计。

#include "stdafx.h"   // Make sure UNICODE is defined before windows.h       
#include "winapiTest1.h"

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPCSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL, L"Goodbye, cruel world!", L"Note", MB_OK);
return 0;
}

请注意,字符串文字现在有一个 L 前缀。这告诉 Visual C++ 编译器将文字解释为 UTF-16 编码的字符串(请注意,它可能会将其转换为其他 C++ 编译器上的不同编码;这仅适用于 Visual C++)。

另请注意,上述建议仅适用于仅使用 Windows API 的情况。一些包装 Windows API 的框架和库有自己的处理 Unicode 字符串的规定。如果您使用的是框架/库,请遵循这些。

关于c - winprog.org 第一个例子奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11603049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com