gpt4 book ai didi

c++ - Unicode 导致关闭消息框终止程序

转载 作者:行者123 更新时间:2023-11-28 01:01:51 25 4
gpt4 key购买 nike

我正在开发一个 Win32 API 包装器。为了使其符合 Unicode,我执行以下操作:

#ifndef UNICODE
#define gchar char
#define gstrcpy strcpy
#define gstrncpy strncpy
#define gstrlen strlen
#define gstrcat strcat
#define gstrncat strncat
#define gstrcmp strcmp
#define gstrtok strtok
#else
#define gchar wchar_t
#define gstrcpy lstrcpy
#define gstrncpy lstrncpy
#define gstrlen lstrlen
#define gstrcat lstrcat
#define gstrncat lstrncat
#define gstrcmp lstrcmp
#define gstrtok lstrtok
#endif

我也提供

#define uni(s) TEXT(s)

我的测试包括一个通过以下方式创建消息框的窗口

msg (uni("Left-click"));

每当用户左键单击窗口时。问题是,无论创建了多少条消息,在我#define UNICODE 时关闭这些消息中的 4 条或 5 条之后,显示的下一个消息框,无论是新的还是最后一个关闭的消息框都会导致程序返回 0xC0000005。不定义 UNICODE 将使这项工作完美。我的消息函数如下:

dword msg (cstr = uni(""), cstr = uni(""), hwin = null, dword = 0);
...
dword msg (cstr lpText, cstr lpCaption, hwin hWnd, dword uType)
{
return MessageBox (hWnd, lpText, lpCaption, uType);
}

其中dword为DWORD,cstr为pchar,也就是gchar *,可以为char *或wchar_t *,hwin为HWND,null为0。

这可能不是消息框造成的,但我没有做任何其他与文本相关的测试,所以我会看看它是否也会以其他方式崩溃。

有人知道为什么会这样吗? MB 字符和 unicode 之间的差异不应导致程序反复崩溃。如果需要,我也可以上传 header 和测试。

编辑:我刚刚发现创建一条消息然后关闭实际窗口将导致同样的崩溃。 SOURCE CODE这是来源的链接。请记住:a) 我只上过一门第一年的编程类(class)(C++)。b) 我的包装器的目的是使编写 win32 应用程序尽可能简单。c) 我喜欢自己做东西(字符串类等)。

也忘记了这个(duh),我正在使用 Code::Blocks (MinGW)。

编辑:我之前没有意识到,程序正试图访问 0x00000000 处的内存。这就是导致问题的原因,但我不知道为什么它会尝试这样做。我相信尝试访问它的指令位于 winnt.dll 中的某处,但由于从未学习过如何调试,我仍在努力弄清楚如何找到我需要的信息。

编辑:现在,不更改它,而是在另一台计算机上运行它,它引用 0x7a797877 而不是 0。

编辑:将窗口过程更改为包含 WM_LBUTTONDOWN 并在内部调用 msg(),而不是调用添加的过程,从而使程序完美运行。 addmsg() 和窗口过程的编码方式导致 _lpWindowName 和 _lpClassName 在一段时间后数据损坏,但非指针成员仍然保留。

编辑:在所有这些困惑之后,我终于发现我的所有源代码中都缺少一个字符。当我将 msgparams 定义为 Window、UINT、WPARAM、LPARAM 并且同样使用 msgfillparams(名称除外)时,我忘记传递引用。我按值(value)传递了窗口!我仍然要感谢发帖的每个人,因为我确实在调试器方面得到了成功,并且最终也学到了很多关于 Unicode 的知识。

最佳答案

你应该在问关于 SO 的问题之前做好功课。我的印象是,您几乎不知道 Unicode 在 Windows 上的工作原理,需要很多页才能解释。

将应用程序从 ANSI 移植到 Unicode 在 Windows 上是一件大事。付钱给有经验的人做这件事似乎是合理的。

主要是所有与 char 一起工作的东西都必须与 wchar_t 一起工作。

整个 API 还有其他功能,但您应该首先使用 Windows 支持,而不是编写您自己的,第一步是使用 _T 而不是 W,这样您就可以开始更改代码,并且仍然能够在 Unicode 和 ANSI 中编译。

关于c++ - Unicode 导致关闭消息框终止程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8333593/

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