Поиск:

Ответ в темуСоздание новой темы Создание опроса
> com-сервер в виде dll-библиотеки, Метод должен визуально отображать объект 
V
    Опции темы
qwerty2
  Дата 6.1.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.5.2010

Репутация: нет
Всего: нет



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

Для моей задачи основное это визуализировать объект, может кто-нибудь подскажет, как лучше это сделать, чтоб потом клиент, написанный для .NET, смог использовать эту библиотеку?
PM MAIL   Вверх
log584
Дата 6.1.2011, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.1.2010

Репутация: нет
Всего: нет



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

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

Если изначально твой "объект" основан на технологии Native "COM", то, я думаю единственный рациональный способ - нужно использовать технологию .NET - "Reflection", которая в изобилии описана в MSDN.
PM MAIL   Вверх
qwerty2
Дата 6.1.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.5.2010

Репутация: нет
Всего: нет



Хорошо, попробую еще раз изложить задачу.
Мне нужен COM-клиент для .NET, использующий методы COM-сервера, который в свою очередь реализован в виде dll
В частности, я не знаю, как реализовать отображение объекта на экран. Раньше было сделано через hdc,rectangle и прочие подобные функции, а в .NET же такое не пашет.
PM MAIL   Вверх
log584
Дата 6.1.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.1.2010

Репутация: нет
Всего: нет



Цитата(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 клиента, или "реализовать отображение объекта на экран"? Давай, конкретнее что бы мы в песочнице не игрались.
PM MAIL   Вверх
qwerty2
Дата 6.1.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.5.2010

Репутация: нет
Всего: нет



Цитата

Подожди, в чем проблема, вызвать методы 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;
}


PM MAIL   Вверх
log584
Дата 6.1.2011, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.1.2010

Репутация: нет
Всего: нет



Понимаешь, да в твоем коде даже разбираться не стоит, я же говорю,
Код

class CRect: public IServer{...

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

/TLBOUT:[path\]filename

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

Это сообщение отредактировал(а) log584 - 7.1.2011, 09:24
PM MAIL   Вверх
log584
Дата 7.1.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.1.2010

Репутация: нет
Всего: нет



PM MAIL   Вверх
qwerty2
Дата 8.1.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.5.2010

Репутация: нет
Всего: нет



Сделал Com через ATL Project в VisualStudio
Подскажите, пожалуйста, как в моем методе COM-сервера использовать функции из пространства имен system::drawing?
PM MAIL   Вверх
log584
Дата 8.1.2011, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.1.2010

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) log584 - 8.1.2011, 19:48
PM MAIL   Вверх
qwerty2
Дата 8.1.2011, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.5.2010

Репутация: нет
Всего: нет



Цитата

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

Эх, если б из любопытства! 
По заданию объект (некая геометрическая фигура) должен выводиться на экран с помощью метода из com, каким образом это будет происходить мне не говорили.
log584, есть какой попроще способ, кроме способа тобой описанного?
PM MAIL   Вверх
log584
Дата 9.1.2011, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.1.2010

Репутация: нет
Всего: нет



GDI/GDI+
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.