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 <comdef.h>
#include <atlbase.h>
///////////////////////////////////////////////////////////
//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消息。
结构或大内存块打包的办法(上2)
中、下篇将介绍“借用IStream流打包传递数据到MSMQ队列”。
结构或大内存块打包的办法(中)
结构或大内存块打包的办法(下)
本文地址:http://com.8s8s.com/it/it1247.htm