// 函数名:LoadStreamOnHugeMemory
// 功能: 同上
// 第一个参数pvMem指向一块要打包的内存,第二个参数指明这块内存的大小
HRESULT LoadStreamOnHugeMemory(void pvMem, ULONG cbSize)
{
// Get Memory Handle:
HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, cbSize);
If(NULL == h) return E_OUTOFMEMORY;
LPVOID pv = GlobalLock(h);
If(!pv) return E_OUTOFMEMORY;
// Copy to memory block
CopyMemory(pv, pvMem, cbSize);
CComPtr<IStream> spStream;
// Create stream on Memory:
HRESULT hr = CreateStreamOHGlobal(h, TRUE, &spStream);
If(FAILED(hr))
{
GlobalUnlock(h);
GlobalFree(h);
return hr;
}
// stream now owns the memory
// unlock the data
GlobalUnlock(hGlobal);
// 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;
.. ..
} |