使用文件映射时我遇到问题并阅读它。
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文本的文本,它不会显示正确的字符
答案 0 :(得分:3)
如果您的文件数据不是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且编码匹配,那么您可以使用泛型{{ 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);