// 函数名: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; .. .. } |