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函数的定义: // 第一个参数: // 作用:接收者 // 第二个参数: // 类型:_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消息。
中、下篇将介绍“借用IStream流打包传递数据到MSMQ队列”。
文章来源于领测软件测试网 https://www.ltesting.net/