繁体   English   中英

如何在Edit控件中显示LPVOID类型的字符串

[英]How to display string from LPVOID type in Edit control

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

Bellow代码,我得到了pMemory表单MapViewOfFile,但我不知道如何向E​​dit控件显示内容,我只得到乱七八糟的字符(就像汉字一样)。 我想使用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()来了解Edit窗口是使用Ansi还是UTF-16。 至于文件数据,你可以尝试使用IsTextUnicode() ,但是已知这会报告错误的结果,所以你真的不应该依赖它。 提前了解文件编码的内容和代码,或者提示用户进行文件编码。

正如您所说,您的文件没有UTF-16编码,但您的Edit控件使用的是UTF-16。 您可以使用MultiByteToWideChar将UTF-8转换为UTF-16。

注意使用MultiByteToWideChar需要调用2次,例如:

int size_needed = MultiByteToWideChar(CP_UTF8, 0, (LPCCH)pMemory, -1, NULL, 0);
wchar_t *buffer = new wchar_t[size_needed];
MultiByteToWideChar(CP_UTF8, 0, (LPCCH)pMemory, -1, buffer, size_needed);

第一次是获取转换所需的大小,第二次是放入宽字符串。 查看更多: http//msdn.microsoft.com/en-us/library/windows/desktop/dd319072%28v=vs.85%29.aspx

您的代码可以编辑:

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);

int size_needed = MultiByteToWideChar(CP_UTF8, 0, (LPCCH)pMemory, -1, NULL, 0);
wchar_t *buffer = new wchar_t[size_needed];
MultiByteToWideChar(CP_UTF8, 0, (LPCCH)pMemory, -1, buffer, size_needed);

FileSize = GetFileSize(hFile, NULL);
SendMessage(hWndEdit, WM_SETTEXT, 0, (LPARAM)buffer);
delete[] buffer;
UnmapViewOfFile(pMemory);
CloseHandle(hMapFile);
CloseHandle(hFile);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM