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.youkuaiyun.com/TrackBack.aspx?PostId=12751