结构或大内存块打包的办法(上11)_第1页
结构或大内存块打包的办法(上11)_第2页
结构或大内存块打包的办法(上11)_第3页
结构或大内存块打包的办法(上11)_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论