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

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



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

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

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


i_i
(';')
(V),(V),,
JS
...
Рейтинг: 0 / 0
29.04.2004, 10:37
    #32502021
tors
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в COM
Есть 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
29.04.2004, 10:55
    #32502064
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в COM
Тогда тебе придется самому писать
приемника событий интерфейса диспетчеризации :)

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

Код: 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
29.04.2004, 13:21
    #32502532
tors
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в COM
автор
Тогда тебе придется самому писать
приемника событий интерфейса диспетчеризации :)

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

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

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

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

Как бы мне получить этот хе...в диспинтерфейс?
Какого он не поддерживается?
Поможите, уже два дня на месте стою!!!!!!!!!!
C ув. Tors
...
Рейтинг: 0 / 0
29.04.2004, 15:16
    #32502855
tors
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в COM
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
29.04.2004, 15:45
    #32502950
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в COM
нет , я не понимаю , что у тя билдер не сделал реализацию
приема событий ??
или как ?

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

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



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

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

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

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

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


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


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