You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向RichEdit控件设置RTF文本时出现ERROR_INVALID_HANDLE错误如何解决

问题原因&修复方案

你遇到的ERROR_INVALID_HANDLE(错误码6)本质是参数不匹配、API使用不当的问题,按以下步骤修正即可:

  1. RTF编码与标志位不匹配
    你使用宽字符(std::wstringstream)存储RTF内容,但调用EM_STREAMIN时只传了SF_RTF标志,该标志默认要求输入ANSI编码的RTF文本。要兼容宽字符输入,需要额外加上SF_UNICODE标志,消息参数改为SF_RTF | SF_UNICODE。
  2. 回调函数计数逻辑错误
    EDITSTREAM回调的cb参数单位是字节,但std::wstringstream::readsome的第二个参数是要读取的wchar_t元素个数,你直接传cb会导致读取长度计算错误,需要改成cb / sizeof(wchar_t)。同时readsome返回的是读取的元素个数,赋值给*pcb时要乘以sizeof(wchar_t)转回字节数,符合回调的参数要求。
  3. 错误获取方式错误
    EM_STREAMIN消息的执行错误会直接写入EDITSTREAM结构体的dwError字段,调用GetLastError拿到的是之前其他API的残留错误值,没有参考意义,不需要调用该接口。
  4. 返回值判断逻辑错误
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:48:01