



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文档来源为 :从网络收集整理 .word 版本可编辑 .欢迎下载支持 The information in this article applies to: - Microsoft Visual C+ 6.0,SP5 结构或大内存块打包的办法 (上 1.1) Revision History: Version Date Creator Description 2004-2-23 郑昀 草稿 Implementation Scope: 继续阅读之前,我们假设您熟悉以下知识: n SAFEARRAY n ISTREAM n Microsoft MSMQ 目录: 1:概述 2:借用 SAFEARRA
2、Y 打包把结构写入 MSMQ 队列 3:借用 IStream 流打包传递数据到 MSMQ 队列 1.概述 通常我们建议通过 MSMQ 传递基于 XML 的字符串,但有时候也需要传递一些结构或者一些接 口指针,那么如何打包传递呢? 这实际上可以转换为一个普适问题: 如何把一个结构体(structure object)或者巨大内存块(比如 5MB 左右)打包为 PROPVARIANT-compatible 的类型? 首先, IMSMQMessagePtr 的 Body 属性接收 _variant_t 参数 : inline void IMSMQMessage:PutBody ( const _va
3、riant_t if (FAILED(_hr) _com_issue_errorex(_hr, this, _uuidof(this); 如果我们想把结构作为消息的 Body 写入 MSMQ 消息队列,我们需要把我们的结构、大内存块 或接口指针转换为 _variant_t。 2.借用 SAFEARRAY 打包把结构写入 MSMQ 队列 把一个结构体打包为 PROPVARIANT-compatible 的类型, 需要用到 SAFEARRAY ,一个带有边界 信息的数组。这是一个常用技巧,很多文章都有提及,我就不多解释了。 但是,注意这种方式一次只能打包 65536 字节以下的数据,这是由于 SA
4、FEARRAY* SafeArrayCreateVector( VARTYPE vt, long lLbound, unsigned int cElements); 的定义所限制的。 我们通常会用 SafeArrayCreateVector API 创建一个单维 SAFEARRAY ,分配一个 sizeof(_DATA) 大小的连续内存块,而这个函数的第三个参数是一个 unsigned int 类型,所以最大值就只能是 65536 了。 更多SAFEARRAY知识,参见使用SAFEARRA传递对象。 下面给出打包的步骤( VC+ 代码): 这里本还有很长一段代码,由于文档长度限制为64KB,只
5、好放在上1.2篇了,希望谅解。 结构或大内存块打包的办法(上 1.2 ) 上 2 篇继续介绍如何读取这样的 MSMQ 消息。 结构或大内存块打包的办法(上 2) 中、下篇将介绍“借用 IStream 流打包传递数据到 MSMQ 队列”。 结构或大内存块打包的办法(中) 结构或大内存块打包的办法(下) 、 、 结构或大内存块打包的办法(上 1.2) Revision History: Version Date Creator Description 2004-2-23 郑昀 草稿 2.借用 SAFEARRAY 打包把结构写入 MSMQ 队列 续上1.1篇的打包步骤(VC+代码): / Chang
6、eStruct2Var函数的定义: / 第一个参数: / 类型: CComVariant / 作用:接收者 / 第二个参数: / 类型: _DATA* / 作用:源 HRESULT ChangeStruct2Variant (CComVariant / 使用 SafeArrayCreateVector API 创建一个单维 SAFEARRAY ,分配一个 sizeof(_DATA) 大小的 连续内存块 / VT-UI1 代表非负整形的变量类型, 1 个字节 / 常数 0定义数组的下界 LPSAFEARRAY lpsa = SafeArrayCreateVector(VT_UI1, 0, siz
7、eof(_DATA); LPBYTE pbData = NULL; if (lpsa) 在你访问SAFEARRAY数据之前,你必须调用 SafeArrayAccessData。该函数锁定数据并且返 回一个指针。在这里,锁定数组意味着增加该数组的内部计数器(cLocks) hr = SafeArrayAccessData(lpsa, (void *) else hr = HRESULT_FROM_WIN32(GetLastError(); if (SUCCEEDED(hr) / 使用 safe array: / 将传入的 _DATA 指针指向的内存复制到 pbData CopyMemory(pb
8、Data, pData, sizeof(*pData); / 设置 var 的类型为数组 var.vt = VT_ARRAY|VT_UI1; / 将 var 和我们的单维 SAFEARRAY 拉上关系: var.parray = lpsa; if (pbData) /相应用来释放数据的函数是 SafeArrayUnaccessData(),该功能释放该参数的计数 SafeArrayUnaccessData(var.parray); if (FAILED(hr) / 销毁 SAFEARRAY SafeArrayDestroy(lpsa); return hr; / /Added Headers:
9、 / #include #include / /Added for MSMQ: / #import mqoa.dll no_namespace, named_guids typedef struct _DATA int _n; char _str; _DATA; /main: IMSMQMessagePtr pisMsg = NULL; hr = pisMsg.CreateInstance(MSMQ.MSMQMessage); _DATA msg; msg._n = 1; msg._str = 1; CComVariant var; / 打包函数: ChangeStruct2Variant(var, / 打包后的 CComVariant 传递给 MSMQMessege 的 Body 属性: pisMsg-Body= var; pisMsg-AppSpecific=-1; / 发送到消息队列: pisMsg-Send(pisQueue); 这样,就可以成功地把一个结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五年级上数学教案-三角形的面积练习课-苏教版秋
- 三年级上册数学教案-1.1 估算两、三位数乘一位数丨苏教版
- 学习2025年雷锋精神六十二周年主题活动实施方案 (3份)-76
- 苏教版数学三年级上册单元测试卷-第四单元-两、三位数除以一位数含答案
- 人教版三年级英语上册期末测试卷
- 2025年河南省安全员《A证》考试题库及答案
- 2025辽宁省安全员知识题库
- 医院钢结构居间合同范本
- 2025年度城市综合体车位租赁合同
- 2025年度股权质押合同工商局备案及企业环境管理体系认证服务协议
- 血流限制训练对老年人下肢力量作用的研究进展
- 中国寺庙经济市场深度调研与未来前景发展预测研究报告(2024-2030版)
- 与信仰对话 课件-2024年入团积极分子培训
- 中医护理学-情志护理
- 中学美术《剪纸艺术》完整课件
- 诺如病毒教学课件
- 适用的法律法规和其他要求的符合性评价
- 沪科版八年级物理上册 专题01 运动的世界【考题猜想】(92题18大类型)
- 消防设施救援培训考试题及答案
- 肾包膜下血肿护理
- 租船问题(教学设计)-2023-2024学年四年级下册数学人教版
评论
0/150
提交评论