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 |
郑昀 |
草稿 |
:
继续阅读之前,我们假设您熟悉以下知识:
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] |
|
|
|
|
|
|
|
本文档仅供参考。本文档所包含的信息代表了在发布之日,zhengyun对所讨论问题的当前看法,zhengyun不保证所给信息在发布之日以后的准确性。
用户应清楚本文档的准确性及其使用可能带来的全部风险。可以复制和传播本文档,但须遵守以下条款:
- 复制时不得修改原文,复制内容须包含所有页 ;
- 所有副本均须含有 zhengyun的版权声明以及所提供的其它声明 ;
- 不得以赢利为目的对本文档进行传播 。
文章来源于领测软件测试网 https://www.ltesting.net/