Здравствуйте, Wild_boy, Вы писали:
W_>Значит имеется такая проблема:
W_>Есть COM сервер, которому необходимо передать объект типа VARIANT или типа него ( не знаю как это выглядит в C# ),
W_>а затем из этого объекта необходиом получить поток. Есть аналогичный код на C++
W_>void CCmdPaintToStream::_GetImage(IGDBThemePainter& painter, CCoreSetUrlI& outUrl) // exception
W_>{
W_> ASSERT(painter.m_lpDispatch); // must be already created
W_> _variant_t varStream;
W_> // m_eType filled in CCmdPaintBase::Execute
W_> if (m_eType == eEMF)
W_> painter.GetImage(ObjLand_Const::gdbImageStream, &varStream);
W_> else
W_> painter.GetImage(ObjLand_Const::gdbImageStreamBMP, &varStream);
W_> ASSERT(varStream.vt == VT_UNKNOWN); // returned variant must be unknown interface
W_> LPSTREAM pStream = 0;
W_>TRY
W_>{
W_> HRESULT hRes = varStream.punkVal->QueryInterface(&pStream);
W_> VRF_OS_ERROR(hRes == S_OK, hRes); // exception
W_> outUrl.Set(QCommandSpecs::tempStream, pStream); // exception. Adds refcount of stream
W_> pStream->Release();
W_>}
W_>CATCH_ALL(e)
W_>{
W_> if(pStream != 0)
W_> pStream->Release();
W_> THROW_LAST(); // exception
W_>}
W_>END_CATCH_ALL
W_>}
W_>Здесь IGDBThemePainter — COM объект
W_>varStream — та самая переменная из которой надо получить поток
W_>Как реализовать то же самое на C# ( .NET Framework Class Library )?
W_>P.S. Извеняюсь если хреново всё это объяснил — сам нихрена не могу понять
Я думаю вряд ли кто-то захочет переписывать это на C#. Если у тебя есть COM длл-ка, можешь воспользоваться утилитой TlbImp.exe, она обычно находиться ...\Microsoft Visual Studio .NET\FrameworkSDK\Bin. Эта утилита создаст управляемую длл-ку, внутрености которой можешь посмотреть спомощью дисассемблера, Анакрино или Reflector'а, как захочешь.
С уважением.