在richeditctrl 读取RTF的例子中,有一个回调函数,在这个函数中无法正确执行memcpy,这都是因为修改成unicode字符集,元来的多字符集是可以正确执行的。DWORD CALLBACK CAutoRichEditCtrl::CBStreamIn(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
// We insert the rich text here./*
This function taken from CodeGuru.com
http://www.codeguru.com/richedit/rtf_string_streamin.shtml
Zafir Anjum
*/ CString *pstr = (CString *) dwCookie; if (pstr->GetLength() < cb)
{
*pcb = pstr->GetLength();
memcpy(pbBuff, (LPCTSTR) *pstr, *pcb);//此处无法把字符串拷贝到bpBuff,正常可以全部拷贝上,
                                                      //但此处只能拷贝1个字符
pstr->Empty();
}
else
{
*pcb = cb;
memcpy(pbBuff, (LPCTSTR) *pstr,  *pcb);
*pstr = pstr->Right(pstr->GetLength() - cb);
}
/// return 0;
}

解决方案 »

  1.   

    *pcb = pstr->GetLength();  //*pcb的值是多少?
    是不是pcb ==1 导致的?
      

  2.   

    不是,这个值是正常的,180左右。
    我怀疑两个地方,一个是memecpy,也找到了这个函数的unicode版本,wmemcpy,但参数又不方便修改。
    LPBYTE pbBuff 这个参数太讨厌了,如果不用这个类型就会报错。下面是调用函数:void CAutoRichEditCtrl::SetRTF(CString sRTF)
    {
    // Put the RTF string sRTF into the rich edit control. // Read the text in
    EDITSTREAM es;
    es.dwError = 0;
    es.pfnCallback = CBStreamIn;
    es.dwCookie = (DWORD) &sRTF;
    StreamIn(SF_RTF, es); // Do it.

    }
      

  3.   

    *pcb的值是多少?
    另外 unicode 每个字符占2个字节,要*2
      

  4.   

    用这个吧wchar_t *wcscpy( wchar_t *strDestination, const wchar_t *strSource );
      

  5.   

    memcpy(pbBuff, (LPCTSTR) *pstr, pcb->GetLength());//
      

  6.   

    您传进来的pbBuff申请了多大内存?够用吗?
      

  7.   

    如果你写的全部是汉字,长度不会少的,估计你用的是字母或者数字什么的,因为这些用unicode表示的时候,有一个字节是0,被认为是结束符号了!
    所以,建议用:wcscpy
      

  8.   

     错了
    应该memcpy(pbBuff, pstr->GetBuffer(0), *pcb);
    不对就
    memcpy(pbBuff, pstr->GetBuffer(0), *pcb×2);
      

  9.   

    请问 wcscpy 要求的参数需要 wchar_t 类型,但调用的地方如果不是LPBYTE就会出错EDITSTREAM es;
    es.dwError = 0;
    es.pfnCallback = CBStreamIn;    //在这里提示:无法从“DWORD (__stdcall *)(DWORD,CString,LONG,
                                    //LONG *)”转换为“EDITSTREAMCALLBACK”
    es.dwCookie = (DWORD) &sRTF;
    StreamIn(SF_RTF, es); // Do it. 
      

  10.   

    看清楚,lz用的不是strcpy,而是memcpy,memcpy管你是不是0的,就按你指定的字节copy的,你说的wcscpy遇上连续2个0不也就结束了CString *pstr = (CString *) dwCookie; 另lz
    DWORD 强制成CString,你传入的是什么最好把调用部分的代码也贴出来
      

  11.   

    wmemcpy( (wchar_t*) pbBuff, pstr->GetBuffer(0), *pcb);这样可以调试通过,但结果一样,只能复制到第一个字符“{” ,我看过多字节版本,是可以复制整个字符串的,*pcb的值没有问题。
      

  12.   

    另外,怀疑lz是解析pbBuff的时候按多字节解析的,所以只显示一个字符,其实内容已经在pbBuff里面了
      

  13.   

    这段代码是在www.codeguru.com 下的,在代码里面贴有地址,直接运行没有问题,转换成unicode后就不能用了,后来找到可能是memcpy 或者是 参数LPBYTE 的问题
      

  14.   

    wmemcpy( (wchar_t*) pbBuff, pstr->GetBuffer(0), pstr->GetLength());
      

  15.   

    wmemcpy 的返回值是完整的字符串,但复制过去好像也不行? wchar_t *str;
    str = wmemcpy( (wchar_t*) pbBuff, *pstr, *pcb);
    pbBuff = (LPBYTE)str;
      

  16.   

    CString *pstr = (CString *) dwCookie; if (pstr->GetLength() < cb) 

    *pcb = pstr->GetLength(); 
    memcpy(pbBuff, (LPCTSTR) *pstr, *pcb);//此处无法把字符串拷贝到bpBuff,正常可以全部拷贝上, 
                                                          //但此处只能拷贝1个字符 
    pstr->Empty(); 

    else 

    *pcb = cb; 
    memcpy(pbBuff, (LPCTSTR) *pstr,  *pcb); 
    *pstr = pstr->Right(pstr->GetLength() - cb); 

    dwCookie的大小是多少?memcpy(pbBuff, (LPCTSTR) *pstr, *pcb);
    -->
    memcpy(pbBuff, (LPCTSTR) *pstr, *pcb * sizeof(CString));
      

  17.   

    估计是RTF格式不支持unicode
    你把CString都改为CStringA就没问题了,但是汉字显示是乱码
      

  18.   

    可以试一下这个,在我这里没问题
    CStringA rtf="{\\rtf1\\ansi\\ansicpg936\\deff0\\deflang1033\\deflangfe2052{\\fonttbl{\\f0\\fnil\\fcharset134 Times New Roman;}{\\f1\\fswiss\\fcharset0 Arial;}{\\f2\\fnil\\fcharset0 Times New Roman;}}\
    {\\colortbl ;\\red0\\green0\\blue255;\\red255\\green0\\blue0;}\
    \\viewkind4\\uc1\\pard\\cf1\\lang2052\\b\\f0\\fs20\\'c4\\'e3\\'ba\\'c3\\cf2\\ul\\b0\\i\\'c4\\'e3\\'ba\\'c3\\f1 nihao\\cf0\\ulnone\\i0\\f2\\par}";
     
      

  19.   

    不甘心啊,RTF就是文本,也没有特殊符号,unicode应该支持的
      

  20.   

    刚才仔细看了一下文档,内容支持unicode,但是控制字符还要是ansi的
    所以你那样写是有问题的,而且里面还要有一些字符集,代码页的配置看一下rtf的标准文档吧
    http://d.download.csdn.net/down/406305/meric
      

  21.   


    我测试了下,好像是那么回事,pbBuff这个指针里面已经有值了,给他输出到字符串里面就能看出来,看来问题主要集中在 LPBYTE 上了。 memcpy(pbBuff, /*(LPCTSTR)*/ *pstr, *pcb*2); CString   str;
    str.Format(_T("%s"),   pbBuff);
    pbBuff = (LPBYTE)str.GetBuffer();
      

  22.   

    可以了,转换成多字节方式就没问题了,奇怪的是不需要memcpy拷贝字符串了。不知道有没有问题。
    一会结贴,感谢:# Conry# (我笨善良) 和 xylicon的乘2的提示,以及所有回复的朋友。
    WideCharToMultiByte( CP_ACP, 0, *pstr, -1,  (LPSTR)pbBuff, *pcb, NULL, NULL );