// 智能流指针
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 |