powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / События в COM
16 сообщений из 16, страница 1 из 1
События в COM
    #32501352
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть CoClass, у него есть события.
Я получил интерфейс(INeroDrives), но в нем ничего типа OnDone нет
(по документацииим они есть у CoClass'а).
Зато они обьявлены у всяких там :
interface _INeroEvents : public TDispWrapper<IDispatch>
видимо в Com как то хитро надо работать с событиями
Помогите.

C ув. Tors
...
Рейтинг: 0 / 0
События в COM
    #32501761
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I[что-то]Events - обычно так обзываются интерфейсы для работы с событиями, их и нужно использовать.
...
Рейтинг: 0 / 0
События в COM
    #32501852
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это СОМ то сделай Project->Import type library -> install
да и не мучайся , builder все сам за тебя сделает ,
всмусле компоненту .



i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
События в COM
    #32501874
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Если это СОМ то сделай Project->Import type library -> install
да и не мучайся , builder все сам за тебя сделает ,
всмусле компоненту .

Я именно так исделал.
автор
I[что-то]Events - обычно так обзываются интерфейсы для работы с событиями, их и нужно использовать.

Пытаюсь получить I[что-то]Events, NULL.
Правда не проверял, что возвращает HRESULT
...
Рейтинг: 0 / 0
События в COM
    #32501886
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээ а ты как пытаешся работать с событиями ?
там же ничего мудренного нету
тем более что реализацию приемника событий на стороне клиента
сделал для тебя уже билдер для этой уже полученной компененты.


i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
События в COM
    #32502021
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть Com обьекты которые добавились в палитру(их можно создавать непосредственно, как написано в доке по NeroCom), а есть, интерфейсы которых получаются вызовом, например, Nero->GetDrives.
B последних нету ничего похожего на OnXxx.
Зато OnXxx есть у _INeroXxxEvents, это диспинтерфейс,
и :
HRESULT hr=tmpdrive->QueryInterface(DIID__INeroDriveEvents,(void **)&drvevents);
if(hr==E_NOINTERFACE)
{
ShowMessage("Вот хр...!!!");
}

Не поддерживается он.
Пролучал интерфейс самого-самого главного обьекта, оттуда:
HRESULT hr=INero->QueryInterface(DIID__INeroDriveEvents,(void **)&drvevents);
Не поддерживает!!!

Кстати диспинтерфейсы получать надо тем же макаром, что и интерфейсы, иликак по другому?
...
Рейтинг: 0 / 0
События в COM
    #32502064
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда тебе придется самому писать
приемника событий интерфейса диспетчеризации :)

Возможно даже так ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include <utilcls.h>
typedef void __fastcall (__closure * TTEvent)( /*params*/ );

class TTestEvent :
   public TEventDispatcher<TTestEvent, &DIID__INeroDriveEvents>
{
protected:
  TTEvent FEvent;

  HRESULT InvokeEvent(DISPID id, TVariant* params)
  {
      if ((FEvent != NULL)) 
        FEventy(params[ 0 ],...);
      return S_OK;
  }
  CComPtr<IUnknown> m_pSender;

public:
  __property TTEvent OnXXX =
    { read =FEvent, write = FEvent };

public:
  TTestEvent :m_pSender(NULL), FEvent(NULL) { }
  virtual ~TTestEvent()
  {
     Disconnect();
  }
  void Connect(IUnknown* pSender)
  {
     if (pSender != m_pSender)
        m_pSender = pSender;
     if (NULL != m_pSender)
       ConnectEvents(m_pSender);
  }
  void Disconnect()
  {
    if (NULL != m_pSender)
    {
      DisconnectEvents(m_pSender);
      m_pSender = NULL;
    }
  }
};



i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
События в COM
    #32502532
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Тогда тебе придется самому писать
приемника событий интерфейса диспетчеризации :)

Не нравится мне эта перспективка.
Думаю есть способ попроще.

В VB у этого интерфейса тоже нету OnXxx.
Но он обявлен:
Public WithEvents drive As NeroDrive
После чего для него можно определить событие как для любого компонента.

Есть ли что нить подобное в бульдере?
Чтоб я мог определить события, не обязательно c помощью IDE, ручками.
C ув. Tors
...
Рейтинг: 0 / 0
События в COM
    #32502600
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двже не знаю как на VB я его в глаза не видел ..

i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
События в COM
    #32502849
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
interface _INeroDriveEvents : public TDispWrapper<IDispatch>

Как бы мне получить этот хе...в диспинтерфейс?
Какого он не поддерживается?
Поможите, уже два дня на месте стою!!!!!!!!!!
C ув. Tors
...
Рейтинг: 0 / 0
События в COM
    #32502855
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
template <class T>
class _INeroDriveEventsDispT : public TAutoDriver<_INeroDriveEvents>
{
public:
_INeroDriveEventsDispT(){}

void Attach(LPUNKNOWN punk)
{ m_Dispatch = static_cast<T*>(punk); }

HRESULT __fastcall OnProgress(long* ProgressInPercent/*[in,out]*/,
VARIANT_BOOL* Abort/*[in,out]*/);
HRESULT __fastcall OnAddLogLine(Nerolib_tlb::NERO_TEXT_TYPE* TextType/*[in,out]*/,
BSTR* Text/*[in,out]*/);
HRESULT __fastcall OnSetPhase(BSTR* Text/*[in,out]*/);
HRESULT __fastcall OnDisableAbort(VARIANT_BOOL* EnableAbort/*[in,out]*/);
HRESULT __fastcall OnWriteDAE(long* TrackNumber/*[in,out]*/, VARIANT* Data/*[in,out]*/);
HRESULT __fastcall OnDoneDAE(VARIANT_BOOL* Ok/*[in,out]*/);
HRESULT __fastcall OnDoneErase(VARIANT_BOOL* Ok/*[in,out]*/);
HRESULT __fastcall OnDoneBurn(Nerolib_tlb::NERO_BURN_ERROR* StatusCode/*[in,out]*/);
HRESULT __fastcall OnAborted(VARIANT_BOOL* Abort/*[in,out]*/);
HRESULT __fastcall OnDoneImport(VARIANT_BOOL* Ok/*[in,out]*/,
Nerolib_tlb::INeroFolder** Folder/*[in,out]*/,
Nerolib_tlb::INeroCDStamp** CDStamp/*[in,out]*/);
HRESULT __fastcall OnMajorPhase(Nerolib_tlb::NERO_MAJOR_PHASE* phase/*[in,out]*/);
HRESULT __fastcall OnSubTaskProgress(long* ProgressInPercent/*[in,out]*/,
VARIANT_BOOL* Abort/*[in,out]*/);
HRESULT __fastcall OnDoneWaitForMedia(VARIANT_BOOL* Success/*[in,out]*/);
HRESULT __fastcall OnDoneCDInfo(Nerolib_tlb::INeroCDInfo* pCDInfo/*[in]*/);
HRESULT __fastcall OnDoneImport2(VARIANT_BOOL bOk/*[in]*/,
Nerolib_tlb::INeroFolder* pFolder/*[in]*/,
Nerolib_tlb::INeroCDStamp* pCDStamp/*[in]*/,
Nerolib_tlb::INeroImportDataTrackInfo* pImportInfo/*[in]*/
,
Nerolib_tlb::NERO_IMPORT_DATA_TRACK_RESULT importResult/*[in]*/);
HRESULT __fastcall OnDriveStatusChanged(Nerolib_tlb::NERO_DRIVESTATUS_RESULT driveStatus/*[in]*/);

};
typedef _INeroDriveEventsDispT<_INeroDriveEvents> _INeroDriveEventsDisp;
C ув. Tors
...
Рейтинг: 0 / 0
События в COM
    #32502950
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет , я не понимаю , что у тя билдер не сделал реализацию
приема событий ??
или как ?

i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
События в COM
    #32502972
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы вообще тебе посоветовал ,
создай свой COM обьект , простой ,
где просто метод ,в этом методе возбуждается событие
зарегестрируй ,

сделай клитента (тоесть просто import type library )
и в файле xxx_OCX.cpp который появится посмотри ,
как реализовано прием событий ...



i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
События в COM
    #32503005
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote]нет , я не понимаю , что у тя билдер не сделал реализацию
приема событий ??
или как ? [/quote]
Реализация приема событий- что это такое?
Есть Com-обьект, по доке у него есть события, но в палитре его нету.
Есть интерфейс у него, который я получил.
Есть функция обработчик.
Как мне задать обработчик события для Com- обьекта?

TNero - ес ть в палитре, длоя него определить событие не проблема.

C ув. Tors
...
Рейтинг: 0 / 0
События в COM
    #32503536
rst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реализация приема событий- что это такое?
К сожалению не знаю я - есть ли в билдере волшебная кнопка какая..

Если по простому( вдруг поможет :)) :
Реализация приема событий - клиент должен создать класс(не абстрактный) который будет реализовывать все методы этого, так называемого , dispинтерфейса искомого объекта.. (т.е. отнаследоватся от этого интерфейса)
Далее создать и передать указатель на экземпляр этого класса ком объекту ( ключевое слово IConnectionPoint) ..
После этого событие будет получаться клиентом так:
Исходный Com объект проверяет все подключенные к нему клиентские объекты и вызывает соответствующие методы ..

Вроде так :)..
...
Рейтинг: 0 / 0
События в COM
    #32503762
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой пример как раз к тому и вел :))


i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / События в COM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]