结构或大内存块打包的办法(上1.2)
来源:互联网 发布:脑洞大开的日剧知乎 编辑:程序博客网 时间:2024/05/23 16:58
The information in this article applies to: |
- Microsoft Visual C++ 6.0,SP5 |
结构或大内存块打包的办法(上1.2)
Revision History:
Version | Date | Creator | Description |
1.0.0.1 | 2004-2-23 | 郑昀 | 草稿 |
2.借用SAFEARRAY打包把结构写入MSMQ队列
续上1.1篇的打包步骤(VC++代码):
// ChangeStruct2Var函数的定义: // 第一个参数: // 类型:CComVariant // 作用:接收者 // 第二个参数: // 类型:_DATA* // 作用:源 HRESULT ChangeStruct2Variant (CComVariant &var, _DATA *pData) { HRESULT hr = S_OK; // 使用SafeArrayCreateVector API创建一个单维SAFEARRAY,分配一个sizeof(_DATA)大小的连续内存块 // VT--UI1代表非负整形的变量类型,1个字节 // 常数'0'定义数组的下界 LPSAFEARRAY lpsa = SafeArrayCreateVector(VT_UI1, 0, sizeof(_DATA)); LPBYTE pbData = NULL; if (lpsa) { //在你访问SAFEARRAY数据之前,你必须调用SafeArrayAccessData。该函数锁定数据并且返回一个指针。在这里,锁定数组意味着增加该数组的内部计数器(cLocks) hr = SafeArrayAccessData(lpsa, (void **)&pbData); } else hr = HRESULT_FROM_WIN32(GetLastError()); if (SUCCEEDED(hr)) { // 使用safe array: // 将传入的_DATA指针指向的内存复制到pbData CopyMemory(pbData, 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: //////////////////////////////////////////////////////////// #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, &msg); // 打包后的CComVariant传递给MSMQMessege的Body属性: pisMsg->Body= var; pisMsg->AppSpecific=-1; // 发送到消息队列: pisMsg->Send(pisQueue); .. .. } |
这样,就可以成功地把一个结构递交到MSMQ队列中了。
上2篇继续介绍如何读取这样的MSMQ消息。
中、下篇将介绍“借用IStream流打包传递数据到MSMQ队列”。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12751
- 结构或大内存块打包的办法(上1.2)
- 结构或大内存块打包的办法(上1.2)
- 结构或大内存块打包的办法(上1.2)
- 结构或大内存块打包的办法(中)
- 结构或大内存块打包的办法(中)
- 结构或大内存块打包的办法(下)
- 结构或大内存块打包的办法(中)
- 结构或大内存块打包的办法(下)
- 结构或大内存块打包的办法(中)
- 结构或大内存块打包的办法(中)
- 结构或大内存块打包的办法(下)
- 结构或大内存块打包的办法(中)
- 结构或大内存块打包的办法(上2)
- 结构或大内存块打包的办法(上2)
- 结构或大内存块打包的办法(上1.1)
- 结构或大内存块打包的办法(上2)
- 结构或大内存块打包的办法(上1.1)
- 结构或大内存块打包的办法(上2)
- 结构或大内存块打包的办法(中)
- [Domino]Java访问Domino邮件代码片断[3]
- 全新方式探索微内容世界[AD]
- 阳为SS/SN 阴为SP(下)
- JSLIU 的 wxWindows 入门
- 结构或大内存块打包的办法(上1.2)
- 结构或大内存块打包的办法(上1.1)
- 阳为SS/SN 阴为SP(中)
- [Regex]Greta不支持“Named Groups”特性
- 处理BLOCK
- [Domino]Java访问Domino R5必需配置的服务器设置
- 结构或大内存块打包的办法(上2)
- 致命的效率:漫谈RSS阅读器效率
- 结构或大内存块打包的办法(下)