gpt4 book ai didi

c++ - 如何在编辑控件中显示 LPVOID 类型的字符串

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

我在使用文件映射和阅读时遇到问题。

在下面的代码中,我从 MapViewOfFile 中获取了 pMemory,但我不知道如何将内容显示到 Edit 控件,我只得到乱七八糟的字符(如汉字)。我想使用 UNICODE

szFileName = L"abc.txt";
hFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);

pMemory = MapViewOfFile(hMapFile, FILE_MAP_READ, 0,0,0);
FileSize = GetFileSize(hFile, NULL);
SendMessage(hWndEdit, WM_SETTEXT, 0, (LPARAM)(LPCWSTR)pMemory);
UnmapViewOfFile(pMemory);
CloseHandle(hMapFile);
CloseHandle(hFile);

谁能帮帮我???

更新:我调试过 pMemory 并确定它包含地址。当我使用仅包含 ASCII 文本的文件时 + 使用 SendMessageA --> 它工作得很好,显示正确的文本(但不是单独的行)。但是如果我使用带有 UNICODE 文本的文本,它不会显示正确的字符

最佳答案

如果您的文件数据不是 UTF-16 编码,但您的编辑窗口使用的是 UTF-16(因为它是用 RegisterClassW()RegisterClassExW() 注册的) ),那么您必须:

  1. 使用 MultiByteToWideChar()(或等价物)自行将文件数据转换为 UTF-16,然后使用 SendMessageW() 发送 WM_SETTEXT.

  2. 使用 SendMessageA() 发送 WM_SETTEXT 并让操作系统使用操作系统的默认 Ansi 代码页将数据转换为 UTF-16(这仅适用如果文件数据与操作系统的默认编码匹配)。

如果您的文件数据是 UTF-16 编码的,但您的编辑窗口没有使用 UTF-16(因为它是用 RegisterClassA()RegisterclassExA() 注册的) ),那么您必须:

  1. 使用 WideCharToMultiByte()(或等价物)自行将文件数据转换为 Ansi,然后使用 SendMessageA() 发送 WM_SETTEXT.

  2. 使用 SendMessageW() 发送 WM_SETTEXT 并让操作系统使用操作系统的默认 Ansi 代码页将数据转换为 Ansi。

如果您的文件数据是 UTF-16 编码的并且您的编辑窗口使用的是 UTF-16,或者如果您的文件数据是 Ansi 编码的并且您的编辑窗口使用的是 Ansi 并且编码匹配,那么您可以使用通用 SendMessage() 发送 WM_SETTEXT 按原样传递数据,无需进行任何转换。

您可以使用 IsWindowUnicode() 了解编辑窗口使用的是 Ansi 还是 UTF-16。至于文件数据,您可以尝试使用 IsTextUnicode(),但已知会报告错误结果,因此您真的不应该依赖它。提前知道您的文件编码是什么并为此编码,或者提示用户输入文件编码。

关于c++ - 如何在编辑控件中显示 LPVOID 类型的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20125957/

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