Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с обработчиком COM-событий (COM Events) / 5 сообщений из 5, страница 1 из 1
04.03.2021, 16:49
    #40050767
kapas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с обработчиком COM-событий (COM Events)
//....................
Пытаюсь реализовать перехват событий в Word
Код: pascal
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
//....................
  const
    IID_IApplicationEvents: TGUID = '{000209F7-0001-0000-C000-000000000046}';
  type
    IApplicationEvents = dispinterface
    ['{000209F7-0001-0000-C000-000000000046}']
      procedure Startup; dispid 1;
      procedure Quit; dispid 2;
      procedure DocumentChange; dispid 3;
    end;
    IDocumentEvents = dispinterface
    ['{000209F6-0000-0000-C000-000000000046}']
      procedure New; dispid 4;
      procedure Open; dispid 5;
      procedure Close; dispid 6;
    end;
    TCoreInterceptor = class(TObject, IUnknown, IDispatch)
//....................
    public
      procedure Connnect(AComObject: OleVariant); overload; virtual;
      procedure Disconnnect(); overload; virtual;
//....................
    end;  
//....................
      function TCoreInterceptor.QueryInterface(const IID: TGUID; out Obj): HResult;
      begin
        Result := E_NOINTERFACE;
        Pointer(Obj) := nil;
        if (GetInterface(IID, Obj)) then
          begin
            Result := S_OK;
          end;
        if (not Succeeded(Result)) then
          begin
            if (IsEqualIID(IID, IDocumentEvents) or IsEqualIID(IID, IApplicationEvents)) then
              begin
                if (GetInterface(IDispatch, Obj)) then
                  begin
                    Result := S_OK;
                  end;
              end;
          end;
      end;
      procedure TCoreInterceptor.Connnect(AComObject: OleVariant);
      var
        APointContainer: IConnectionPointContainer;
        AConnectionPoint: IConnectionPoint;
        AInterface: IDispatch;
        AEnumerator: IEnumConnectionPoints;
        AIndexOf: longint;
        AIndexOfOf: longint;
      begin
        AInterface := IDispatch(AComObject);
        OleCheck(AInterface.QueryInterface(IConnectionPointContainer, APointContainer));
        if (not Assigned(APointContainer)) then exit;
        APointContainer.FindConnectionPoint(IID_IApplicationEvents, AConnectionPoint); // AConnectionPoint ---> nil
// или    OleCheck(APointContainer.FindConnectionPoint(IID_IApplicationEvents, AConnectionPoint)); ---> Исключение
        if (not Assigned(AConnectionPoint)) then exit;
        FConnectionPoint := AConnectionPoint;
        OleCheck(FConnectionPoint.Advise(Self, FCookie));
      end;
//....................


Ломается на этой строке:
APointContainer.FindConnectionPoint(IID_IApplicationEvents, AConnectionPoint); // AConnectionPoint ---> nil
// или OleCheck(APointContainer.FindConnectionPoint(IID_IApplicationEvents, AConnectionPoint)); ---> Исключение

В чем может быть проблема?
...
Рейтинг: 0 / 0
04.03.2021, 22:24
    #40050881
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с обработчиком COM-событий (COM Events)
Просто сделай Import type library (см. рисунок). Нажимаешь "Create Unit" и смотришь как должно быть.
...
Рейтинг: 0 / 0
05.03.2021, 02:05
    #40050914
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с обработчиком COM-событий (COM Events)
Соколинский Борис,

Кстати, а если офис установлен, а MS Word Object Library в списке нет?..
Возможно потому что офис x64, а сама среда x86?
...
Рейтинг: 0 / 0
05.03.2021, 03:54
    #40050922
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с обработчиком COM-событий (COM Events)
Может чем поможет 22015020
...
Рейтинг: 0 / 0
05.03.2021, 08:09
    #40050938
kapas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с обработчиком COM-событий (COM Events)
Спасибо всем кто откликнулся.
1. Не работает с этим определением dispinterface
Код: pascal
1.
2.
3.
4.
5.
6.
  IApplicationEvents = dispinterface
  ['{000209F7-0001-0000-C000-000000000046}']
    procedure Startup; dispid 1;
    procedure Quit; dispid 2;
    procedure DocumentChange; dispid 3;
  end;


Работает со след. определениями (это IApplicationEvents2 в Word_TLB.pas) - TGUID = '{ 000209FE-0000 -0000-C000-000000000046}'
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  const
    IID_IApplicationEvents: TGUID = '{000209FE-0000-0000-C000-000000000046}';
//..............................
  type
    IApplicationEvents = dispinterface
    ['{000209FE-0000-0000-C000-000000000046}']
      procedure Startup; dispid 1;
      procedure Quit; dispid 2;
      procedure DocumentChange; dispid 3;  
//..............................
   end;



2. Похоже разрядность приложения и Office не имеет значения (хотя до конца не уверен).
3. CoInitialize(nil) не решает проблему.

Тему можно было бы закрыть, если стало бы понятно почему не поддерживается
Код: pascal
1.
2.
3.
4.
5.
6.
  IApplicationEventsDisp1 = dispinterface
    ['{000209F7-0001-0000-C000-000000000046}']
    procedure Startup; dispid 1;
    procedure Quit; dispid 2;
    procedure DocumentChange; dispid 3;
  end;



Кстати сказать что, до какого-то момента с использованием интерфейса (['{ 000209F7-0001 -0000-C000-000000000046}']) отрабатывалось криво (на событие Quit возвращался dispid = 3). Возврат точки соединения перестал отрабатываться после того как соотв. код из приложения аккуратно перенес в класс TCoreInterceptor.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с обработчиком COM-событий (COM Events) / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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