GetWindowTextLength возвращает 0, когда текст находится в элементе управления редактирования - PullRequest
0 голосов
/ 12 апреля 2011

Я пишу текстовый редактор и у меня возникают проблемы с сохранением файлов в формате utf-8. У меня есть функция, которая читает текст из элемента управления rich edit и записывает его в файл использование флага, переданного функции, которая зависит от настроек пользователя. Это может быть utf-16, ascii или utf-8. И сегменты записи файлов utf-16 и ascii работают нормально и создают допустимые файлы. Проблема заключается в том, что в следующем блоке кода вызов GetWindowTextLength всегда возвращает 0. Таким образом, в результате ничего не извлекается из окна или не записывается в файл.

 HANDLE hFile;
 if ((hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, 
      NULL, CREATE_ALWAYS, 0, NULL)) == INVALID_HANDLE_VALUE) {
      return FALSE;
 }

 int    iLength = 0;
 DWORD  dwBytesWritten = 0;

 switch (encoding) {

/*other text encoding cases*/

     case ID_SETTINGS_UTF_8: {
        try {
            iLength = GetWindowTextLength(hwndEdit);  //returns 0

            unique_ptr<wchar_t> wide_buf(new wchar_t[iLength + 1]);
            GetWindowTextW(hwndEdit, wide_buf.get(), iLength + 1);

            int bytes_needed = WideCharToMultiByte(CP_UTF8, WC_COMPOSITECHECK |
                WC_DEFAULTCHAR | WC_NO_BEST_FIT_CHARS, wide_buf.get(), -1,
                NULL, 0, NULL, NULL);

            unique_ptr<char> utf8_buf(new char[bytes_needed]);

            WideCharToMultiByte(CP_UTF8, WC_COMPOSITECHECK |
                WC_DEFAULTCHAR | WC_NO_BEST_FIT_CHARS, wide_buf.get(), -1,
                utf8_buf.get(), bytes_needed, NULL, NULL);

            WriteFile(hFile, utf8_buf.get(), bytes_needed, 
                        &dwBytesWritten, NULL);

            if (bytes_needed != dwBytesWritten) {
                        CloseHandle (hFile);
                         return FALSE;
            }

             CloseHandle (hFile) ;
             return TRUE;
        } catch (bad_alloc& ba) {
            UNREFERENCED_PARAMETER(ba);
            CloseHandle (hFile);
            return FALSE;
        }
    }
    break;

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Ты испортил кучу. new[] должно соответствовать delete[], а не delete.

Проще просто использовать std::vector:

std::vector<wchar_t> wide_buf(iLength + 1);
//...
std::vectorchar> utf8_buf(bytes_needed);
0 голосов
/ 13 апреля 2011

Ваше приложение скомпилировано как UNICODE или ANSI? (вы используете объявления GetWindowTextLength и GetWindowTextW)

Можете ли вы показать код для ANSI и для UTF-16 (где вы получите правильный результат).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...