Оформление класса в виде 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 нет автоматизации позволяющей создавать пользовательские типы поэтом у все придется делать ручками
Другие работы по теме:
Таможенное оформление товаров
Таможенное оформление - представляет собой заявление уполномоченным лицом (декларантом или таможенным брокером) по установленной форме точных сведений о товарах в соответствии с требованиями избранного таможенного режима.
Классификация элитного жилья
Классификация элитного жилья. Вся-то и беда в том, что такой классификации, четкой, структурированной и единой, в нашей стране до сих пор не существует. У нас вообще-то и с самим понятие элитное жилье не все определено. И все-таки, как же из этого положения выходят застройщики и риелторы?
Деление простых признаков понятия
Положительные и отрицательные признаки понятия. Существенные и несущественные признаки. Отличительные и неотличительные признаки понятия.
Умения и навыки выполнения электромонтажных работ
Graphics Graphics Приобрести первичные профессиональные навыки на основании прохождения практики на конкретном предприятии Приобрести первичные профессиональные навыки на основании прохождения практики на конкретном предприятии Формирование умений и навыков в выполнении электромонтажных работ Закрепление и совершенствование знаний и практических навыков, полученных в процессе обучения Graphics
Схема составления психолого педагогической характеристики класса
СХЕМА СОСТАВЛЕНИЯ ПСИХОЛОГО – ПЕДАГОГИЧЕСКОЙ ХАРАКТЕРИСТИКИ КЛАССА. 1. Общие сведения о классе. История его формирования, состав по возрасту и полу учащихся. Социальная характеристика семей учащихся. Общая характеристика успеваемости класса, дисциплина, характеристика общественных поручений учащихся класса.
Таможенное оформление - растаможивание грузов
Ввоз в страну любых материальных объектов контролируется соответствующими таможенными службами. И если товары для личного использования ввести достаточно просто, то коммерческий товаропоток регламентируется очень строго.
Внеурочная деятельность по предмету Список творческих работ, ов, учебно-исследовательских работ, проектов, выполненных учащимися по предмету, и их резу
Список творческих работ, рефератов, учебно-исследовательских работ, проектов, выполненных учащимися по предмету, и их результаты (за три года)
Количественная школа управления 2
Количественная школа управления (с 1950гг – по н. в.) Основная предпосылка возникновения - усложнение процесса управления, что было обусловлено бурным научно - техническим прогрессом послевоенных лет.
Содержание и задачи статистической сводки
Сведения о каждой единице анализируемой совокупности, полученные в результате первой стадии статистического исследования, характеризуют статистическое наблюдение с различных его сторон, так как они обладают многочисленными признаками и свойствами, которые изменяются во времени и пространстве.
Семнадцатая поправка
17-я поправка (фр. Rиglement 17, англ. Regulation 17) — закон, направленный против использования французского языка в образовательной системе провинции Онтарио, изданный в 1912 году консервативным правительством Джеймса Уитни. Закон запрещал использование французского языка как основного средства преподавания после 1 класса, и вообще как предмет после 4 класса.
Коронационный альбом Александра Второго
Введение 1 История издания 2 Оформление альбома 3 План Введение 4 Переиздание 5 Источники Введение Коронационный альбом Александра II – церемониальный альбом.
Табель о рангах
При равенстве класса по "Табели" военный чин считался выше придворного, а придворный выше гражданского. Чины в гвардии считались до 1884 года на два класса выше чем в армии, с1884 года на один класс выше.
Классы в C++
Одной из основных черт C++, которой нет в С, является концепция классов. По существу, классы - самое важное понятие в C++. Классы похожи на структуры языка С. Однако структура С определяет только данные, ассоциированные с этой структурой.
Полиморфные Вектора
У вас есть другая возможность - определить ваш векторный и другие вмещающие классы через указатели на объекты некоторого класса.
Класс Строка
Вот довольно реалистичный пример класса string. В нем производится учет ссылок на строку с целью минимизировать копирование и в качестве констант применяются стандартные символьные строки C++.
Свободная Память
Если вы пользовались классом slist, вы могли обнаружить, что ваша программа тратит на заметное время на размещение и освобождение объектов класса slink.
Добавление к Классу
Для производного класса можно определить данные и функции дополнительно к тем, которые наследуются из его базового класса. Это дает альтернативную стратегию обеспечить средства связанного списка.
Программа, реализующая тип данных "вещественная матрица"
Этапы реализации класса "вещественная матрица", позволяющего осуществлять основные операции с вещественными прямоугольными и транспонированными матрицами. Листинг программы, которая реализует тип данных "вещественная матрица" и принципы работы с ними.
Основы создания лабиринта и движение в нём
Text Text Text Text Text Text Text Graphics Выполните построение лабиринта и задайте движения объекта по составленному лабиринту, переместив объекты в указанное место (склад). Выполните построение лабиринта и задайте движения объекта по составленному лабиринту, переместив объекты в указанное место (склад).
Задача по Бухгалтерскому учету
Задание 1. Отразить операции на счетах бухгалтерского учета. Исходные данные. Согласно приказу работник направлен в загранкомандировку в США с 15 по 21 января. Работник выезжает 15 января и в этот же день пересекает границу России. При
Пищеварение 2 2
Text Text Graphics Работу выполнил Работу выполнил ученик 8б класса Артемьев Артём Graphics Graphics
Исследование устойчивости объекта экономики
Исследование устойчивости функционирования объекта экономики впервые выполняется на стадии проектирования, затем при выполнении экономической, экологической и технической экспертиз.
Обеспечение лазерной безопасности
Под лазерной безопасностью понимается совокупность технических, санитарно-гигиенических и организационных мероприятий, обеспечивающих безопасные условия труда персонала при использовании лазерных установок.