向RichEdit控件设置RTF文本时出现ERROR_INVALID_HANDLE错误如何解决
问题原因&修复方案
你遇到的ERROR_INVALID_HANDLE(错误码6)本质是参数不匹配、API使用不当的问题,按以下步骤修正即可:
- RTF编码与标志位不匹配
你使用宽字符(std::wstringstream)存储RTF内容,但调用EM_STREAMIN时只传了SF_RTF标志,该标志默认要求输入ANSI编码的RTF文本。要兼容宽字符输入,需要额外加上SF_UNICODE标志,消息参数改为SF_RTF | SF_UNICODE。 - 回调函数计数逻辑错误
EDITSTREAM回调的cb参数单位是字节,但std::wstringstream::readsome的第二个参数是要读取的wchar_t元素个数,你直接传cb会导致读取长度计算错误,需要改成cb / sizeof(wchar_t)。同时readsome返回的是读取的元素个数,赋值给*pcb时要乘以sizeof(wchar_t)转回字节数,符合回调的参数要求。 - 错误获取方式错误
EM_STREAMIN消息的执行错误会直接写入EDITSTREAM结构体的dwError字段,调用GetLastError拿到的是之前其他API的残留错误值,没有参考意义,不需要调用该接口。 - 返回值判断逻辑错误
SendMessage发送EM_STREAMIN的返回值是成功读取的字符数,不是布尔值,只要es.dwError为0就说明操作成功。
修正后的完整代码
回调函数修正:
DWORD CALLBACK EditStreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { std::wstringstream *rtf = (std::wstringstream*) dwCookie; // 字节数转宽字符元素个数 auto readCount = rtf->readsome((wchar_t*)pbBuff, cb / sizeof(wchar_t)); // 元素个数转字节数赋值 *pcb = readCount * sizeof(wchar_t); return 0; }
调用逻辑修正:
std::wstringstream rtf(L"{\\rtf1Hello!\\par{ \\i This } is some { \\b text }.\\par}"); EDITSTREAM es = { 0 }; es.dwCookie = (DWORD_PTR)&rtf; es.pfnCallback = &EditStreamInCallback; // 新增SF_UNICODE标志,匹配宽字符输入 SendMessage(richEdit, EM_STREAMIN, SF_RTF | SF_UNICODE, (LPARAM)&es); if (es.dwError == 0) { // 操作成功逻辑 } else { // 错误处理,直接取es.dwError即可 }
内容的提问来源于stack exchange,提问作者qloq
相关产品推荐
相关产品推荐

