Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ActivX (вызов метода)

343
07 марта 2007 года
lena_ki
282 / / 14.04.2005
[SIZE=3][FONT=Times New Roman]В файле C:\Program Files\Microsoft Office\OFFICE11\MSCAL.OCX находиться ActiveX календарь. Подключаю его к проекту Project->Import Type Library и далее Create Unit.[/FONT][/SIZE]
[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]
 
Код:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 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]
246
08 марта 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: lena_ki
[SIZE=3][FONT=Times New Roman]В файле C:\Program Files\Microsoft Office\OFFICE11\MSCAL.OCX находиться ActiveX календарь. Подключаю его к проекту Project->Import Type Library и далее Create Unit.[/FONT][/SIZE]
...
Однако в библиотеке типов MSACAL_TLB.h нет объявления ATL для метода Create.



http://support.microsoft.com/kb/311219

Код:
//in hpp
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();
343
09 марта 2007 года
lena_ki
282 / / 14.04.2005
Большое спасибо! Все понятно. Как раз читаю книгу по COM (Трельсона http://www.bhv.ru/books/full_contents.php?id=406).
Вот еще есть способ:
Если руками добавить в файл 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]
246
09 марта 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: lena_ki

Вот еще есть способ:
Если руками добавить в файл 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 импортируются нормально.

Цитата: lena_ki

CIZMO, у вам есть эта книга?: http://www.semga.ru/ob/book_1534332.html


Не знаю как у CIZMO, а у меня она есть:) Если честно, то до сих пор так и не прочитал. Говорят, что это одна из лучших книг по Билдеру.

- А Вы с какой целью интересуетесь?
- Вы случайно не из милиции?
(с) Кот Матроскин.

в смысле нужна книга или что...

P.S. ПМ посмотри обязательно!

343
09 марта 2007 года
lena_ki
282 / / 14.04.2005
Цитата: GIZMO

- А Вы с какой целью интересуетесь?
- Вы случайно не из милиции?
(с) Кот Матроскин.



:)

>в смысле нужна книга или что...

[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]

246
09 марта 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: lena_ki
:)
...
Дело в том, что в этой книге на странице 659 описано ...


Книга дома, помотреть не могу, д.б. так:

Код:
class TEventSink : public TEventDispatcher<TEventSink, &DIID_DCalendarEvents>
    {
    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();
...
343
12 марта 2007 года
lena_ki
282 / / 14.04.2005
Cпасибо! Все работает. Удалось реализовать примем событий от сервера.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог