powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с обработчиком COM-событий (COM Events)
5 сообщений из 5, страница 1 из 1
Проблема с обработчиком COM-событий (COM Events)
    #40050767
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
//....................
Пытаюсь реализовать перехват событий в 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
Проблема с обработчиком COM-событий (COM Events)
    #40050881
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто сделай Import type library (см. рисунок). Нажимаешь "Create Unit" и смотришь как должно быть.
...
Рейтинг: 0 / 0
Проблема с обработчиком COM-событий (COM Events)
    #40050914
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Кстати, а если офис установлен, а MS Word Object Library в списке нет?..
Возможно потому что офис x64, а сама среда x86?
...
Рейтинг: 0 / 0
Проблема с обработчиком COM-событий (COM Events)
    #40050922
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может чем поможет 22015020
...
Рейтинг: 0 / 0
Проблема с обработчиком COM-событий (COM Events)
    #40050938
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем кто откликнулся.
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
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с обработчиком COM-событий (COM Events)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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