首页 > 解决方案 > 如何将编辑控件的内容与文件中的文本进行比较?

问题描述

我正在使用 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。为什么会这样?

标签: c++winapistring-comparison

解决方案


说真的,使用调试器并使用包含简单文本(如ABCDE )的文件对其进行测试。只需检查几个变量,您应该能够在不到 30 秒的时间内找出问题所在!

您可以轻松地确定问题不是在阅读函数文档GetWindowTextAhttps://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta)。

您传递的大小包括空终止字符。假设编辑还包含ABCDE,则长度为 5。

调用 GetWindowTextA(hEdit, pszEditText, dwTextLength);wheredwTextLength将返回一个包含ABCD空字符的缓冲区。

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


推荐阅读