c++ - 如何将编辑控件的内容与文件中的文本进行比较?
问题描述
我正在使用 Win32 API 编写一个简单的文本编辑器,并且我正在尝试编写一个函数来将文件的内容与编辑控件的内容进行比较。我目前有这个:
BOOL checkForModification (PCWSTR pszFileName, HWND hEdit) {
BOOL bSuccess = FALSE;
DWORD dwTextLength = GetWindowTextLengthA(hEdit);
hFile = CreateFile(pszFileName, GENERIC_READ,
FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);
if (dwFileSize != 0xFFFFFFFF)
{
PSTR pszFileText;
pszFileText = (PSTR)GlobalAlloc(GPTR, dwFileSize + 1);
if (pszFileText != NULL) {
DWORD dwRead;
if (ReadFile(hFile, pszFileText, dwFileSize + 1, &dwRead, NULL))
{
bSuccess = TRUE;
pszFileText[dwFileSize] = 0;
LPSTR pszEditText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
GetWindowTextA(hEdit, pszEditText, dwTextLength);
int res = CompareStringA(LOCALE_SYSTEM_DEFAULT, NULL, pszFileText, -1, pszEditText, -1);
if (res != CSTR_EQUAL) {
MessageBox(NULL, L"You changed the text!", L"Alert", MB_OK | MB_ICONINFORMATION);
}
GlobalFree(pszEditText);
}
else {
MessageBox(NULL, L"Oh no! Something went wrong!\nError code: 2", L"Error", MB_OK | MB_ICONERROR);
}
GlobalFree(pszFileText);
}
}
CloseHandle(hFile);
}
else {
MessageBox(NULL, L"Oh no! Something went wrong!\nError code: 1", L"Error", MB_OK | MB_ICONERROR);
}
return bSuccess;
}
我遇到的问题是结果CompareStringA
总是返回CSTR_LESS_THAN
,即使我没有更改编辑控件中的文本。文件的编码是 UTF-8。为什么会这样?
解决方案
说真的,使用调试器并使用包含简单文本(如ABCDE )的文件对其进行测试。只需检查几个变量,您应该能够在不到 30 秒的时间内找出问题所在!
您可以轻松地确定问题不是在阅读函数文档GetWindowTextA
(https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta)。
您传递的大小包括空终止字符。假设编辑还包含ABCDE,则长度为 5。
调用 GetWindowTextA(hEdit, pszEditText, dwTextLength);
wheredwTextLength
将返回一个包含ABCD和空字符的缓冲区。
显然 ABCD 在 ABCDE 之前使用通常的排序规则。
推荐阅读
- shopify - 液体嵌套变量输出成变量名
- themes - Silverstripe - 包括样式表和脚本
- python - 基于其他列的熊猫新列:为所有行返回相同的值
- javascript - 生成个性化 URL 以附加到 Shopify 确认电子邮件
- sql-server - 如何在 MS SQL Server 的一个原子操作中重命名两个表
- javascript - 如何在 VueJS v-for 中隐藏一些动态生成的 div
- sql - SQL查询在列中查找子字符串并删除某些字符
- spring-batch - Spring batch - 根据配置动态创建Writer
- excel - 如何使用 VBA 解析网站的标题
- r - 如何定义时间序列中的周期?