怎么用CArchive传送RichEdit中的信息呢?模仿QQ的艰难尝试
发送是按照一个NetChat的程序修改的,采用CArchive/CSocketFile/CSocket的办法,利用Socket能用ArChive读写数据的办法,在建立连接之后建立如下缓冲:
m_ServerSocket->Accept(*m_ClientSocket);
m_ClientSocket->m_status=m_ServerSocket->m_status;
m_socketfile=new CSocketFile(m_ClientSocket);
m_archiveIn=new CArchive(m_socketfile,CArchive::load);
m_arvhiveOut=new CArchive(m_socketfile,CArchive::store);在这个缓冲里m_archiveIn用与接收数据,m_arvhiveOut用于发送,原程序在发送时如下:
void CNetChatDlg::OnBtnSend()
{
...
UpdateData(TRUE); //从发送编辑框中获得数据
*m_arvhiveOut<<m_Output; //CString m_Output:发送编辑框
m_arvhiveOut->Flush();
...
}接收时有:void CNetChatDlg::OnRecive()
{
CString strtemp,strrecv,strleft;
UpdateData(TRUE);
*m_archiveIn>>strrecv;
...
}因为原程序中发送和接收都只是文字不带图片之类,所以CString就能搞定,我改成带图片的之后,就只能传送一个已经保存好的RTF文件,这个文件包含了所有的RichEdit信息。找到的序列化RTF到Archive的代码如下:
void CRichEditCat::StreamOutToArchive(CArchive &ar, BOOL bSelection, int nFormat)
{
EDITSTREAM es;
es.pfnCallback = writeStreamCallBack;
es.dwError = 0;
RichEditCookie cookie(ar);
es.dwCookie = (DWORD)&cookie;
if (bSelection)
{
nFormat |= SFF_SELECTION;
int nR=GetWindowTextLength();
SetSel(nR,nR);
}
StreamOut(nFormat, es);
return ;
}
DWORD CALLBACK CRichEditCat::writeStreamCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
RichEditCookie* pCookie = (RichEditCookie*)dwCookie;
CArchive& ar = pCookie->m_ar;
ar.Flush();
DWORD dw = 0;
*pcb = cb;
TRY
{
ar.GetFile()->Write(pbBuff, cb);
}
CATCH(CFileException, e)
{
*pcb = 0;
pCookie->m_dwError = (DWORD)e->m_cause;
dw = 1;
}
AND_CATCH_ALL(e)
{
*pcb = 0;
pCookie->m_dwError = (DWORD)CFileException::generic;
dw = 1;
// DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return dw;
}同理有读取Archive到RichEdit的函数StreamInFromArchive。在程序中这两个读写函数取代>><<操作符,这是我程序的思路。
这样的过程看起来很靠谱,但是每次试的时候接收端收到的都是空的,是Archive不成功吗?搞不懂这是为个啥。有没有更简单的做法?或者先把Richedit的内容保存到RTF中,再用Archive传输RTF也行啊!
路过的大牛,恳求给指点下,用Archive的办法可以传送RTF格式的文档吗?不大愿意用必须阻塞的文件传输,也不大愿意再开个线程,该怎么改才能让程序接收到数据呢?求指点!
相关推荐
【工业自动化】欧姆龙PLC产品线与编程软件应用:从选型架构到调试排错的全流程技术指南
内容概要:本文《欧姆龙PLC与编程软件完全手册》系统介绍了欧姆龙PLC的产品架构、软件体系、通信协议、选型策略及编程调试技巧。重点区分了两大技术平台:基于CX-Programmer的传统C系列(CP/CJ/CS)与基于Sysmac Studio的新一代Sysmac平台(NJ/NX/NY),强调二者在软件生态、寻址方式和通信架构上的根本差异。手册详细对比了各系列PLC的性能参数,并提供与西门子产品的功能对标,帮助用户快速定位。深入讲解了编程操作中的关键问题,如任务结构设计、间接寻址、FB封装陷阱、在线调试五件套等,特别指出“FB使能关闭时状态不初始化”等易出错点。最后汇总了选型路径与现场避坑清单,极具实战指导价值。; 适合人群:具备一定工业自动化基础,从事PLC编程、设备调试、系统集成的研发工程师和技术人员,尤其是从西门子平台转向欧姆龙或参与新项目选型的1-5年经验从业者。; 使用场景及目标:① 新项目选型时判断应选用C系列还是Sysmac平台;② 编程调试过程中掌握高效操作技巧与常见问题排查方法;③ 实现跨平台迁移、系统升级或接手他人项目时规避架构与逻辑陷阱;④ 提升对欧姆龙PLC任务机制、间接寻址、FB设计等高级功能的理解与应用能力。; 阅读建议:本手册理论结合实践,建议按“先架构后操作”的顺序阅读,重点章节需结合实际工程反复演练。特别是FB设计规范、任务切换处理、强制操作收尾流程等内容,应在仿真环境中验证后再应用于现场。注意版本匹配问题,操作前确认所用软件与控制器固件版本兼容。
CISP-CSE注册云安全工程师备考资源包
CISP-CSE注册云安全工程师备考资源包
科技中介服务机构如何通过AI技术降低技术评估与匹配服务的操作门槛?.docx
科技中介服务机构如何通过AI技术降低技术评估与匹配服务的操作门槛?
国央企创新负责人如何借助平台实现创新资源的高效配置与项目落地?.docx
国央企创新负责人如何借助平台实现创新资源的高效配置与项目落地?
高校技术转移办公室人员如何高效筛选并推介科技成果?.docx
高校技术转移办公室人员如何高效筛选并推介科技成果?


