Re: C# и Com
От: SubZero2000 Украина  
Дата: 11.07.03 13:25
Оценка:
Здравствуйте, 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'а, как захочешь.

С уважением.
(с)(_SZ_)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.