// Serialisieren/DeSerialisieren eines IUnknowns // in diesem Falle ein IDataObject HRESULT CreateStreamOnHGlobalFromIUnknown ( IUnknown *pIUnk, REFCLSID rClsID, IStream **ppIStream) { ASSERT(NULL != pIUnk); ASSERT(NULL != ppIStream); *ppIStream = NULL; try { // neuen Stream anlegen, kreiert eine neuen Memoryblock der Größe NULL // wird selbstständig wieder freigegen (true) WStream IStream; THROW_FAILED_HRESULT(CreateStreamOnHGlobal (NULL, true, IStream.ppi())); // den Enumerator wegschreiben WPersistStream IPersStr (pIUnk); // throws hr THROW_FAILED_HRESULT(OleSaveToStream (IPersStr, IStream)); // wieder zurück positionieren LARGE_INTEGER li; LISet32 (li, 0L); THROW_FAILED_HRESULT(IStream -> Seek (li, STREAM_SEEK_SET, NULL)); *ppIStream = IStream.detach(); } catch (_com_error &e) { return _COM_ERROR(e); } return S_OK; }
/////////////////////////////////////////////////////////////////////////////// // Schreiben/Lesen eines Variant HRESULT SetVariantData (CComVariant &rv, IDataObject *pIDO, const FORMATETC *pcfe) { // Stream mit Variant generieren WStream IStream; HRESULT hr = CreateStreamOnHGlobal (NULL, true, IStream.ppi()); if (FAILED(hr)) return hr; // Variant dort rein schreiben hr = rv.WriteToStream (IStream); if (FAILED(hr)) return hr; LARGE_INTEGER li; LISet32(li, 0L); hr = IStream -> Seek (li, SEEK_SET, NULL); if (FAILED(hr)) return hr; // diesen Stream im DataObject setzen STGMEDIUM stg; stg.tymed = TYMED_ISTREAM; stg.pstm = IStream.detach(); stg.pUnkForRelease = NULL; hr = pIDO -> SetData ((FORMATETC *)pcfe, &stg, true); if (FAILED(hr)) { ReleaseStgMedium (&stg); return hr; } return S_OK; }
// Hinzufügen eines EnumLONG zu einem IDataObject ----------------------------- HRESULT SetEnumLONGData (IEnum<LONG> *pEnum, REFCLSID rClsID, IDataObject *pDataObj) { ASSERT(pEnum); ASSERT(pDataObj); // Stream mit EnumLONG generieren WStream IStream; HRESULT hr = CreateStreamOnHGlobalFromIUnknown (pEnum, rClsID, IStream.ppi()); if (FAILED(hr)) return hr; // diesen Stream im DataObject setzen STGMEDIUM stg; stg.tymed = TYMED_ISTREAM; stg.pstm = IStream.detach(); stg.pUnkForRelease = NULL; hr = pDataObj -> SetData ((FORMATETC *)&c_feSelectedObjects, &stg, true); if (FAILED(hr)) return hr; return NOERROR; }