ActivX (вызов метода)
[SIZE=3][FONT=Times New Roman]Пишу в классе формы:[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3] [/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]#include "MSACAL_TLB.h"[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3] [/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]private: [/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] TCOMICalendar Calendar; [/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3] [/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]Вопрос как инициализировать Calendar? Согласно теории думала так:[/FONT][/SIZE]
{
Calendar = Msacal_tlb::CoCalendar::Create();
}
[FONT=Times New Roman][SIZE=3] [/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Однако в библиотеке типов MSACAL_TLB.h нет объявления ATL для метода Create. Вопрос как правильно инициализировать Calendar для вызова, например, метода [/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Сalendar->AboutBox(); //?[/SIZE][/FONT]
...
Однако в библиотеке типов MSACAL_TLB.h нет объявления ATL для метода Create.
http://support.microsoft.com/kb/311219
ICalendar *pCalendar;
...
//in cpp
...
// create
CoInitialize(NULL);
CoCreateInstance(CLSID_Calendar,
NULL, CLSCTX_INPROC_SERVER, IID_ICalendar, (void**)&pCalendar);
...
// use
pCalendar->AboutBox();
...
// Release
pCalendar->Release();
CoUninitialize();
Вот еще есть способ:
Если руками добавить в файл MSACAL_TLB.h после:
typedef TCOMICalendarT<ICalendar> TCOMICalendar;
объявление:
[FONT=Times New Roman][SIZE=3]*********************************************************************//[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]// COCLASS DEFAULT INTERFACE CREATOR[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]// CoClass : Calendar[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]// Interface: TCOMICalendar[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]// *********************************************************************//[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]typedef TCoClassCreatorT<TCOMICalendar, ICalendar, &CLSID_Calendar, &IID_ICalendar> CoCalendar;[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]то должно работать и Create. Очевидно в Builder не корректно работает [FONT=Verdana][SIZE=2]Project->Import Type Library[/SIZE] :confused:[/FONT][/SIZE][/FONT]
[SIZE=3][/SIZE]
GIZMO, у вам есть эта книга?: http://www.semga.ru/ob/book_1534332.html
[SIZE=3][/SIZE]
[SIZE=3][/SIZE]
Вот еще есть способ:
Если руками добавить в файл MSACAL_TLB.h после:
typedef TCOMICalendarT<ICalendar> TCOMICalendar;
объявление:
// COCLASS DEFAULT INTERFACE CREATOR
// CoClass : Calendar
// Interface: TCOMICalendar
typedef TCoClassCreatorT<TCOMICalendar, ICalendar, &CLSID_Calendar, &IID_ICalendar> CoCalendar;
то должно работать и Create. Очевидно в Builder не корректно работает Project->Import Type Library
Вот так и рождаются мифы про "глючный Билдер":) Ту ссылку которую я дал читала? Это косяк мелкософт. Остальные ActiveX импортируются нормально.
Не знаю как у CIZMO, а у меня она есть:) Если честно, то до сих пор так и не прочитал. Говорят, что это одна из лучших книг по Билдеру.
- А Вы с какой целью интересуетесь?
- Вы случайно не из милиции?
(с) Кот Матроскин.
в смысле нужна книга или что...
P.S. ПМ посмотри обязательно!
- А Вы с какой целью интересуетесь?
- Вы случайно не из милиции?
(с) Кот Матроскин.
:)
>в смысле нужна книга или что...
[FONT=Times New Roman][SIZE=3]Дело в том, что в этой книге на странице 659 описано как можно обрабатывать события, которые происходят в ActiveX. Например, в тестируемом ActiveX (календарь C:\Program Files\Microsoft Office\OFFICE11\MSCAL.OCX) в интерфейсе DCalendarEvents есть события с именем Click, NewYear и др. Пример описанный в книге показывает, как клиент может принимать и обрабатывать события, которые происходят в ActivX-е. Для этого используется так называемый сток событий на основе класса TEventDispatcher и метода InvokeEvent (стр.665). Мне никак не удается переделать этот пример, чтобы обработать, например событие Click календаря. Я в технологии COM уже не много ориентируюсь, многое получается, а вот принять событие в клиенте от ActiveX-а никак не получается. :( Если будет время гляньте тот пример и подскажите реализацию стока для Click из MSCAL.OCX. Очень хочется с COM разобраться. :)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]P.S.[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]На ПМ ответила.[/SIZE][/FONT]
...
Дело в том, что в этой книге на странице 659 описано ...
Книга дома, помотреть не могу, д.б. так:
{
private:
IUnknown *FServer;
protected:
virtual HRESULT InvokeEvent(DISPID id, TVariant* params = 0)
{
// см. id метода в _tlb.h...
if(id == /*id for click*/)
...
return S_OK;
}
public:
TEventSink()
: FServer(NULL)
{
}
~TEventSink()
{
Disconnect();
}
HRESULT Connect(IUnknown *AServer)
{
Disconnect();
HRESULT hRes = ConnectEvents(AServer);
if( SUCCEEDED(hRes) )
{
FServer = AServer;
AServer->AddRef();
}
return hRes;
}
HRESULT Disconnect()
{
if( FServer )
{
HRESULT hRes = DisconnectEvents(FServer);
if( FAILED(hRes) )
return hRes;
FServer->Release();
FServer = NULL;
}
return S_OK;
}
};
...
// use
TEventSink* pEventSink = new TEventSink();
pEventSink->Connect(pCalendar);
...
// Release
pEventSink->Disconnect();
delete pEventSink;
pCalendar->Release();
CoUninitialize();
...