Допустим у вас есть
некоторое приложение, написанное на C++(VC++ если быть корректным). Как оно у
вас появилось не суть важно, может быть это ваша старая разработка, может быть
вы решили сначала отладить предметную часть. Важно то что вы горите желанием
вынести часть классов в объектные модули и оформить их в виде ActiveX, COM и ATL
объектов. Есть несколько типовых проблем связанных с таким
переносом.
Оформление класса в виде 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 пишим
Можно
написать прокси функции. Например для 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");
Передавать в качестве параметров структуры тоже
можно. Такие структуры называются 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 нет автоматизации позволяющей
создавать пользовательские типы поэтом у все придется делать
ручками.
HTML 5 — это грядущее обновление гипертекстового языка разметки, основного
способа создания контента для размещения его во всемирной паутине. Разработка
HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое
изменилось так, что текущие спецификации HTML перестали соответствовать
сегодняшним требованиям.
HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и
соответствовать растущим требованиям разнообразного и смешанного web-контента.
HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье
мы взглянем на 5 новых интересных вещей в HTML 5.
Элемент управления ListView был представлен в .Net Framework 3.5 как замена
устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его
предшественник, но в тоже время лишен некоторых внутренних механизмов, что
впрочем целиком следствие из расширенной универсальности ListView. Среди отличий
ListView и GridView можно назвать и гибкую настройку разметки, что позволяет
выводить данные не только в табличном виде, но и вообще в любом каком пожелает
программист. Благодаря шаблонам ItemTemplate, EditItemTemplate,
InsertItemTeplate можно настроить внешний вид при любом из состояний ListView:
редактировании или выборе элемента.
Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов
для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны
как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net.
Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером
отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report
и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы,
но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов
и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам
сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные
отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в
сфере программных продуктов для Business Intelligence.