您的位置:首页 > 其它

结构或大内存块打包的办法(上1.2)

2008-01-03 20:18 204 查看
The information in this article applies to:[/b]
- Microsoft Visual C++ 6.0,SP5[/b]
结构大内存块打包的办法(上1.2Revision History: 
VersionDateCreatorDescription
1.0.0.12004-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_guidstypedef    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;[/b]// 打包函数:ChangeStruct2Variant(var, &msg);[/b]// 打包后的CComVariant传递给MSMQMessege的Body属性:pisMsg->Body= var;[/b]pisMsg->AppSpecific=-1;// 发送到消息队列:pisMsg->Send(pisQueue);.. ..}
 这样,就可以成功地把一个结构递交到MSMQ队列中了。 上2篇继续介绍如何读取这样的MSMQ消息。结构或大内存块打包的办法(上2) 中、下篇将介绍“借用IStream流打包传递数据到MSMQ队列”。结构或大内存块打包的办法(中) 结构或大内存块打包的办法(下)  

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12751
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: