+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 83.83 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Оформление класса в виде COM объекта в C++

30.11.2009 16:34

Оформление класса в виде COM объекта.

Допустим у вас есть некоторое приложение, написанное на C++(VC++ если быть корректным). Как оно у вас появилось не суть важно, может быть это ваша старая разработка, может быть вы решили сначала отладить предметную часть. Важно то что вы горите желанием вынести часть классов в объектные модули и оформить их в виде ActiveX, COM и ATL объектов. Есть несколько типовых проблем связанных с таким переносом.

Множественные конструкторы.

class MyCOM 
{
MyCOM();
MyCOM(long id);
MyCOM(long id,LPCSTR Name);
:
} 

Знакомо и очень удобно, но в COM правила создания объекта строго определены и ни одна из функции для созданий объектов не позволяет передавать параметры конструктору класса.

Настройку объекта придется вынести в отдельный метод например Init.

// IMyCOM cтандартная обертка наследник от COleDispatchDriver
IMyCOM * d=new IMyCOM;
COleException pErr; 
CString SSS="Mylib.MyCOM";
d->CreateDispatch( SSS,&pErr);
d->Init(15,"Матрица"); // Инициализируем 

В принципе вы можете создать свою фабрику объектов. Это позволит создавать объекты вот так.

IMyOF * d=new IMyOF;
COleException pErr; 
CString SSS="MyLib.MyOF";
d->CreateDispatch( SSS,&pErr);
IMyCOM Ob1(d->CraeteEmpty());
IMyCOM Ob2(d->CraeteId(15));
IMyCOM Ob3(d->CraeteFull(15,SSS ));

Но зачем вам лишний промежуточный объект если можно обойтись без него.

Перегруженные методы.

class MyCOM 
{
:
LPCSTR GetMyRec(long id);
LPCSTR GetMyRec(LPCSTR Name);
AddRec ();
AddRec (long id);
AddRec (long id, LPCSTR Name);
:.
} 

Это вполне законный код С++, но COM не разрешит вам в интерфейсе объявить два метода с одним именем. Это противоречит концепции.

Решение

Можно связать функции с разными методами интерфейса для этого в odl пишим

[id(1)] BSTR AddRecName(BSTR ID);
[id(2)] BSTR AddRecID(long ID);
а в cpp осуществляем привязку.
BEGIN_DISPATCH_MAP(:.)
DISP_FUNCTION(CPSDG, "AddRecName", AddRec, VTS_BSTR, VTS_BSTR)
DISP_FUNCTION(CPSDG, "AddRecId", AddRec, VTS_BSTR, VTS_I2)

DISP_FUNCTION_ID(:.)
END_DISPATCH_MAP()

Можно написать прокси функции. Например для GetMyRec прототип может выглядеть так

LPCSTR GetMyRec (VARIANT id)
{
switch id.vt
{case VT_I4: { return GetMyRec(id.lVal); }
case VT_BSTR: { return GetMyRec(id.bstrVal); }
}
return S_OK;
}

Для функции AddRec можно сделать вот так

HRESULT AddRec (VARIANT id, VARIANT Name)
{
if ((id.vt==VT_EMPTY)&&(Name.vt==VT_EMPTY))
{AddRec() ; return S_OK;}
if ((id.vt==VT_I4)&&(Name.vt==VT_EMPTY))
{AddRec(id.lVal) ; return S_OK;}
if ((id.vt==VT_I4)&&(Name.vt== VT_BSTR))
{AddRec(id.lVal, Name. bstrVal ) ; return S_OK;}
:
}

Этого вполне достаточно, но можно еще изменить объявление метода интерфейса в odl вот так

HRESULT Add(VARIANT [optional, in]id, [optional,in]VARIANT S);

это позволит вызывать метод , более красиво.

Пример на VB

MyObject.Add // Любой из вариантов должен работать 
MyObject.Add 15
MyObject.Add 15, "Var"

Пользовательские типы данных

В сложном проекте полно собственных констант, структур, множеств используемых в качестве параметров .

#define IDL_NEXT 5
#define IDL_STOP 6
:
struct UDT 
{
unsigned long X;
unsigned long Y;

BSTR pbstr;
} UDT;
:
typedef enum EnumType
{
First=1,
Seond=4,
Last =10
};
class MyCOM 
{
:.
void SetType (EnumType T);
void Do(UDT * Dat);
void SetMove (int val);
:.
}
:
// а где то все это вызывается
SetType(First);
UDT Dat,Dat1;
:
Do (&Dat,Dat1);
SetMove (IDL_NEXT);

Понятно что, для того чтобы подобным образом можно было вызывать методы COM объекта, служебные структуры, множества и константы должны быть доступны из вне.

Для этого нужно включить их описание в ODL файл.

Множества описываются так.

[ 
uuid(...), 
version(1.0),
helpstring("...")
]
library LibraryName
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");

typedef enum
{
valueName1 = 0,
valueName2 = 1,
...
valueNameN = N
} EnumType;
..
}

Передавать в качестве параметров структуры тоже можно. Такие структуры называются UDT - User Defined Type. В IDL описываются так:

Typedef [uuid(C1D3A8C0-A4AA-11D0-819C-00A0C90FFFC3)] struct UDT 
{
unsigned long X;
unsigned long Y;
BSTR pbstr;
} UDT;

Описывать параметры метода можно как VARIANT но тогда придется работать с интерфесом IRecordInfo или как UDT:

Do([in]UDT* pIn, [in,out] pOut);

Передать UDT в такой метод проще простого:

UDT some_data, some_returned_data;
p->Do(&some_data, some_returned_data);

Членами UDT могут быть другие UDT или oleautomation-совместимые типы.

У вы в VC нет автоматизации позволяющей создавать пользовательские типы поэтом у все придется делать ручками

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года