C++ 当文本位于编辑控件中时,GetWindowTextLength返回0
我正在编写一个文本编辑器,在将文件保存为utf-8时遇到一些问题。 我有一个函数,可以从rich edit控件读取文本并将其写入文件 使用传递给函数的标志,该标志取决于用户设置。它可以是utf-16、ascii或utf-8。utf-16和ascii文件写入段都可以正常工作并生成有效文件。 问题在于,在下面的代码块中,对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
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容忍这种删除滥用