在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;
}
{
// 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;
}
是不是pcb ==1 导致的?
我怀疑两个地方,一个是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.
}
另外 unicode 每个字符占2个字节,要*2
所以,建议用:wcscpy
应该memcpy(pbBuff, pstr->GetBuffer(0), *pcb);
不对就
memcpy(pbBuff, pstr->GetBuffer(0), *pcb×2);
es.dwError = 0;
es.pfnCallback = CBStreamIn; //在这里提示:无法从“DWORD (__stdcall *)(DWORD,CString,LONG,
//LONG *)”转换为“EDITSTREAMCALLBACK”
es.dwCookie = (DWORD) &sRTF;
StreamIn(SF_RTF, es); // Do it.
DWORD 强制成CString,你传入的是什么最好把调用部分的代码也贴出来
str = wmemcpy( (wchar_t*) pbBuff, *pstr, *pcb);
pbBuff = (LPBYTE)str;
{
*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));
你把CString都改为CStringA就没问题了,但是汉字显示是乱码
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}";
所以你那样写是有问题的,而且里面还要有一些字符集,代码页的配置看一下rtf的标准文档吧
http://d.download.csdn.net/down/406305/meric
我测试了下,好像是那么回事,pbBuff这个指针里面已经有值了,给他输出到字符串里面就能看出来,看来问题主要集中在 LPBYTE 上了。 memcpy(pbBuff, /*(LPCTSTR)*/ *pstr, *pcb*2); CString str;
str.Format(_T("%s"), pbBuff);
pbBuff = (LPBYTE)str.GetBuffer();
一会结贴,感谢:# Conry# (我笨善良) 和 xylicon的乘2的提示,以及所有回复的朋友。
WideCharToMultiByte( CP_ACP, 0, *pstr, -1, (LPSTR)pbBuff, *pcb, NULL, NULL );