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

时间:2013-11-21 16:05:28

标签: c++ winapi

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

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文本的文本,它不会显示正确的字符

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

      您可以使用WM_SETTEXT来了解编辑窗口是使用Ansi还是UTF-16。至于文件数据,您可以尝试使用IsWindowUnicode(),但已知会报告错误结果,因此您真的不应该依赖它。

      提前了解文件编码的内容和代码,或者提示用户进行文件编码。

答案 1 :(得分:1)

正如您所说,您的文件没有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);