The information in this article applies to:
- Microsoft Visual C++ 6.0,SP5
结构或大内存块打包的办法(下)
Revision History:
对本文档所有修改都应按修改时间顺序记录在此。
Version
Date
Creator
Description
1.0.0.1
2004-2-23
郑昀
草稿
Implementation Scope:
继续阅读之前,我们假设您熟悉以下知识:
n SAFEARRAY
n ISTREAM
n Microsoft MSMQ
目录:
1:概述
2:借用SAFEARRAY打包把结构写入MSMQ队列
3:借用IStream流打包传递数据到MSMQ队列
其实,Aydin的实现和ATL中IPersistMemoryImpl接口Load方法实现异曲同工。我们不妨换一种方式实现。
Aydin给出的VC++代码是:
// 智能流指针
CComPtr<IStream> pStream = NULL;
LARGE_INTEGER zero = {0,0};
// hGlobal是内存句柄:
LPBYTE pChunk = (BYTE *) GlobalLock(hGlobal);
// 创建一个空的stream:
HRESULT hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream );
pStream->Seek( zero, STREAM_SEEK_SET, NULL );
ULONG pcbWritten = 0;
// pChunk现在已经指向我们的巨大内存块;
// 我们把这块内存写入IStream流中:
pStream->Write (pChunk, dwNumRead, &pcbWritten);
// 检查是否全部写入了:
ATLASSERT(pcbWritten==dwNumRead);
// unlock the data
GlobalUnlock(hGlobal);
// 剩下的一样,也是让CComPtr <IPersistStream>来调用Load方法加载IStream
// Create a stream holder. Load the stream holder from the global stream.
// THIS STREAM HOLDER IS INTERITED FROM IPersistStream
// And all virtual functions are Modified to handle the object....
CComPtr <IStreamHolder> pHolder = new CComObject <CStreamHolder>;
CComPtr <IPersistStream> pHolderStream;
hr = pHolder->QueryInterface (IID_IPersistStream, (void **)&pHolderStream);
pStream->Seek( zero, STREAM_SEEK_SET, NULL );
pHolderStream->Load(pStream);
CComVariant vComData = pHolder;
.. ..
//
// now, you have a big chunk of memory loaded into a ComVariant
//
// 现在你可以把打包后的CComVariant传递给MSMQMessege的Body属性了:
pisMsg->Body = vComData;
.. ..
//Coder: Aydin T.BAKIR
全文完。
Writen by zhengyun.NoJunk(at)tomosoft.dot.com
Disclaimers:
Programmer’s Blog List:
[MVPLeader]Grace Zhang
本文档仅供参考。本文档所包含的信息代表了在发布之日,zhengyun对所讨论问题的当前看法,zhengyun不保证所给信息在发布之日以后的准确性。
用户应清楚本文档的准确性及其使用可能带来的全部风险。可以复制和传播本文档,但须遵守以下条款:
复制时不得修改原文,复制内容须包含所有页 ;
所有副本均须含有 zhengyun的版权声明以及所提供的其它声明 ;
不得以赢利为目的对本文档进行传播 。