C++ 当文本位于编辑控件中时,GetWindowTextLength返回0

C++ 当文本位于编辑控件中时,GetWindowTextLength返回0,c++,winapi,utf-8,C++,Winapi,Utf 8,我正在编写一个文本编辑器,在将文件保存为utf-8时遇到一些问题。 我有一个函数,可以从rich edit控件读取文本并将其写入文件 使用传递给函数的标志,该标志取决于用户设置。它可以是utf-16、ascii或utf-8。utf-16和ascii文件写入段都可以正常工作并生成有效文件。 问题在于,在下面的代码块中,对GetWindowTextLength的调用始终返回0。因此,其结果是无法从窗口中检索到任何内容或写入文件 HANDLE hFile; if ((hFile = CreateF

我正在编写一个文本编辑器,在将文件保存为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;
handlehfile;
如果((hFile=CreateFile)(pstrFileName,GENERIC_WRITE,0,
NULL,创建\u始终,0,NULL))==无效的\u句柄\u值){
返回FALSE;
}
int长度=0;
DWORD DWBYTESSWRITED=0;
开关(编码){
/*其他文本编码案例*/
案例ID\u设置\u UTF\u 8:{
试一试{
iLength=GetWindowTextLength(HwnEdit);//返回0
独特的全方位(新的wchar_t[iLength+1]);
GetWindowTextW(HwnEdit,wide_buf.get(),iLength+1);
int bytes\u needed=宽图表多字节(CP\u UTF8,WC\u COMPOSITECHECK|
WC_DEFAULTCHAR | WC_NO_BEST_FIT_CHARS,wide_buf.get(),-1,
NULL,0,NULL,NULL);
唯一的(新字符[需要字节]);
宽图表多字节(CP_UTF8,WC_复合检查|
WC_DEFAULTCHAR | WC_NO_BEST_FIT_CHARS,wide_buf.get(),-1,
utf8_buf.get(),需要字节,NULL,NULL);
WriteFile(hFile,utf8\u buf.get(),需要字节数,
&dwbytesWrited,NULL);
if(需要字节数!=dwbytesWrited){
闭合手柄(hFile);
返回FALSE;
}
闭合手柄(hFile);
返回TRUE;
}捕获(错误分配和ba){
未引用的_参数(ba);
闭合手柄(hFile);
返回FALSE;
}
}
打破

您损坏了堆。
new[]
必须与
delete[]
匹配,而不是
delete

只使用
std::vector更简单:

std::vector<wchar_t> wide_buf(iLength + 1);
//...
std::vectorchar> utf8_buf(bytes_needed);
std::向量宽度(i长度+1);
//...
std::vectorchar>utf8\u buf(需要字节);

应用程序编译为UNICODE还是ANSI?(使用GetWindowTextLength和GetWindowTextW声明)


您能否显示ANSI和UTF-16的代码(从中可以得到正确的结果).

这里确实存在一个设计问题。对
GetWindowTextLength
的调用实际上不应该是UTF-8代码所独有的。您应该在公共部分从窗口获取UTF-16文本。类似地,
WriteFile
调用及其错误处理也应该在公共代码中-这方面也没有UTF-8。有两个问题射击问题:在
GetWindowTextLength()
返回0的情况下,如果您将一个大小合理的缓冲区传递给
GetWindowText()
它是否返回任何内容?
GetLastError()
是否说了一些有趣的事情(可能在尝试防止读取过时的错误代码之前调用
SetLastError(0)
)?检查有问题的富文本编辑的hwnd,确保在itI上调用GetWindowTextLength时它是正确的hwnd。在更仔细地阅读有关unique_ptr的内容后,我看看您现在对delete的看法。这可以通过将类型规范更改为unique_ptr来解决。但是当编码被标记为utf-8。我似乎记得MSVC6容忍这种删除滥用