如何将编辑控件的内容与文件中的文本进行比较?

How do you compare the content of an edit control to the text in a file?

我正在使用 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); 其中 dwTextLength 将 returns 包含 ABCD 加上 空字符 [=29] 的缓冲区=].

显然使用通常的排序规则 ABCD 在 ABCDE 之前。

实际上,就我的目的而言,我发现最简单的方法是使用 Edit_GetModify 宏来查看是否对编辑控件中的文本进行了任何编辑。虽然这并不完全符合我的要求(即使您撤消更改,它也会 return TRUE),但它比必须读取整个文件然后将其全部内容与编辑控件。