Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > com-сервер в виде dll-библиотеки


Автор: qwerty2 6.1.2011, 13:04
Visual C++ 2008, язык C++
Мое задание состояло в том, чтобы создать простенький com-сервер в виде dll-библиотеки. 
Методы сервера: отобразить объект на экране, установить координаты, цвет и т.п ничего сверхоригинального.
Кое-как это дело я реализовал для Win32, все работало. Пришел сдавать работу, а преподаватель мне сказал, нечего писать на голом Win Api, переделывай для .NET
И теперь я не знаю, как мне сделать метод отображения объекта на экране. раньше он отображался с использованием winapi'шных функций, а теперь нужно использовть пространство имен system::drawing 
Пытался переделать старый проект, но получил ошибку '/clr' 

Для моей задачи основное это визуализировать объект, может кто-нибудь подскажет, как лучше это сделать, чтоб потом клиент, написанный для .NET, смог использовать эту библиотеку?

Автор: log584 6.1.2011, 19:16
COM, .NET, Win API, все перемешалось  в твоем посте.
Поинтересуйся у преподавателя, все - таки какая конкретная задача стоит перед тобой. Какая конктретная технология должна быть выбрана для решения твоей задачи, ну и конечно же точную формализацию твоей задачи, иначе, я думаю, никто не сможет тебе помочь без более детального разбора твоей ситуации.

Добавлено через 9 минут и 53 секунды
Цитата(qwerty2 @ 6.1.2011,  13:04)
Для моей задачи основное это визуализировать объект, может кто-нибудь подскажет, как лучше это сделать, чтоб потом клиент, написанный для .NET, смог использовать эту библиотеку?

Если изначально твой "объект" основан на технологии Native "COM", то, я думаю единственный рациональный способ - нужно использовать технологию .NET - "Reflection", которая в изобилии описана в MSDN.

Автор: qwerty2 6.1.2011, 19:47
Хорошо, попробую еще раз изложить задачу.
Мне нужен COM-клиент для .NET, использующий методы COM-сервера, который в свою очередь реализован в виде dll
В частности, я не знаю, как реализовать отображение объекта на экран. Раньше было сделано через hdc,rectangle и прочие подобные функции, а в .NET же такое не пашет.

Автор: log584 6.1.2011, 20:34
Цитата(qwerty2 @ 6.1.2011,  19:47)
Мне нужен COM-клиент для .NET, использующий методы COM-сервера, который в свою очередь реализован в виде dll

Понял, пока задача тривиальная. Interoperation - .NET - COM. Давай проект, выкладывай (в виде кода, опять же простого), потому, что пока вопрос вообще общий, разберемся каким образом вызывать методы объектов COM через - Reflection. Потому, что Interoperability by PInvoke именно тот механизм, который тебе нужен будет. Хотя бы один какой - нибудь метод.

Добавлено через 2 минуты и 8 секунд
Цитата(qwerty2 @ 6.1.2011,  19:47)
hdc,rectangle

Сейчас - не цель.

Добавлено через 6 минут и 42 секунды
Цитата(qwerty2 @ 6.1.2011,  19:47)
В частности, я не знаю, как реализовать отображение объекта на экран. Раньше было сделано через hdc,rectangle и прочие подобные функции, а в .NET же такое не пашет.

Подожди, в чем проблема, вызвать методы COM - сервера из .NET клиента, или "реализовать отображение объекта на экран"? Давай, конкретнее что бы мы в песочнице не игрались.

Автор: qwerty2 6.1.2011, 21:24
Цитата

Подожди, в чем проблема, вызвать методы COM - сервера из .NET клиента, или "реализовать отображение объекта на экран"? Давай, конкретнее что бы мы в песочнице не игрались

Я так чувствую и то, и другое  до конца не понимаю...

Чтоб на самом простом разобраться
Код

//объявление статического типа Rect
class CRect: public IServer{
private:
  ULONG     m_dwRefCnt;           //счетчик ссылок
  int x;
  int y;
  int c_red;
  int c_green;
  int c_blue;
public:
  CRect(){ m_dwRefCnt = 0; x=100; y=100;c_red=0;c_green=200;c_blue=0;}      
  //экспонируемые методы
  STDMETHOD(QueryInterface)(REFIID riid,void ** ppvObject);
  STDMETHOD_(ULONG,AddRef)();
  STDMETHOD_(ULONG,Release)();
  STDMETHOD(DrawObj)(int x,int y,HDC hdc);
  STDMETHOD(SetXY)(int x1,int y1){x=x1;y=y1;return S_OK;}
  STDMETHOD(GetXY)(int *x1,int*y1){*x1=x;*y1=y;return S_OK;}
};
//реализация метода
STDMETHODIMP CRect::DrawObj(int x,int y, HDC hdc){
 HPEN hpen;
 HBRUSH hbrush;
 hpen = CreatePen(PS_SOLID, 1, RGB(0,0,0));
 SelectObject(hdc,hpen);
 hbrush=CreateSolidBrush(RGB(100,100,0));
 SelectObject(hdc,hbrush);
 Rectangle(hdc,x,y,x+60,y+30);
 DeleteObject(hpen);
 DeleteObject(hbrush);
return S_OK;
}


Автор: log584 6.1.2011, 22:49
Понимаешь, да в твоем коде даже разбираться не стоит, я же говорю,
Код

class CRect: public IServer{...

В Native - COM - проекте (по крйней мере в MS VC++2008) нужно определить опцию
Код

/TLBOUT:[path\]filename

в настройках линкера, затем использовать утилиту TlbImp.exe, которая создаст Wrapper для твоего COM- объекта. А вот уже созданная бибилиотека с помощью TlbImp будет содержать объекты - заглушки, которые ты будешь использовать в управляемом коде.

Автор: log584 7.1.2011, 10:49
http://narod.ru/disk/2881588001/COMClass.zip.html

Автор: qwerty2 8.1.2011, 16:14
Сделал Com через ATL Project в VisualStudio
Подскажите, пожалуйста, как в моем методе COM-сервера использовать функции из пространства имен system::drawing?

Автор: log584 8.1.2011, 19:44
Зачем? Из любопытства? Наверно, если я правильно понимаю, тут задача чисто в принципе в твоей работе показать что такое возможно и ты умеешь это делать? Что - то твой препод в дебри полез.
Лично у меня таких ситуаций не возникало, чтобы в управляемом клиенте использовать неуправляемый код да еще тут же в неуправляемом управляемый. Ну да ладно, тогда чисто теоретически.

Созданием оберток Managed(Unmanaged) насколько я знаю занимается Tlbimp.exe, вот с ее помощью в проекте, который я дал создана dll - ка, которую ты подключаешь к управляемому проекту. Наоборот в другую сторону Unmanaged(Managed) делает Tlbexp.exe. Вот тебе, чтобы использовать управляемый тип (его методы) в COM нужно на основе управляемой сборки (dll - файла, ну той сборки, которая содержитв себе типы пространства имен System::Drawing, например) создать файл библиотеки типов .tlb и зарегистрировать эту библиотеку. Но по мотивам MSDN, эти две операции сразу делает утилита Regasm.exe. Описание параметров и их значений можно найти так же в MSDN. А вот полученную и зарегистрированную библиотеку типов ты сможешь использовать в Native коде в твоем COM - методе. Ну вот примерно так.

Автор: qwerty2 8.1.2011, 21:45
Цитата

Зачем? Из любопытства? 

Эх, если б из любопытства! 
По заданию объект (некая геометрическая фигура) должен выводиться на экран с помощью метода из com, каким образом это будет происходить мне не говорили.
log584, есть какой попроще способ, кроме способа тобой описанного?

Автор: log584 9.1.2011, 17:38
GDI/GDI+

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)