[英]How to display string from LPVOID type in Edit control
我在使用文件映射并阅读它时遇到问题。
Bellow代码,我得到了pMemory表单MapViewOfFile,但我不知道如何向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()
),那么您必须:
使用MultiByteToWideChar()
(或等效的)将文件数据转换为UTF-16,然后使用SendMessageW()
发送WM_SETTEXT
。
使用SendMessageA()
发送WM_SETTEXT
并让操作系统使用操作系统的默认Ansi代码页将数据转换为UTF-16(仅当文件数据与操作系统的默认编码匹配时才有效)。
如果您的文件数据是UTF-16编码,但您的编辑窗口不使用UTF-16(因为它是使用RegisterClassA()
或RegisterclassExA()
),那么您必须:
使用WideCharToMultiByte()
(或等效的)将文件数据转换为Ansi,然后使用SendMessageA()
发送WM_SETTEXT
。
使用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.