Основы COM-технологий. Артемов М.А. и др. - 26 стр.

UptoLike

Составители: 

Intialize ɢ EventSinkChanged ɚɜɬɨɦɚɬɢɱɟɫɤɢ ɪɟɚɥɢɡɭɸɬɫɹ ɫɪɟɞɨɣ ɩɪɨɝɪɚɦ-
ɦɢɪɨɜɚɧɢɹ Delphi:
procedure <ɢɦɹ ɤɨɦɩɨɧɟɧɬɚ>.EventSinkChanged(const
EventSink: IUnknown);
begin
FEvents := EventSink as <ɢɧɬɟɪɮɟɣɫ ɫɨɛɵɬɢɣ>;
if FConnectionPoint <> nil then
FSinkList := FConnectionPoint.SinkList;
end;
procedure <ɢɦɹ ɤɨɦɩɨɧɟɧɬɚ>.Initialize;
begin
inherited Initialize;
FConnectionPoints := TConnectionPoints.Create(Self);
if AutoFactory.EventTypeInfo <> nil then
FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
AutoFactory.EventIID, ckSingle, EventConnect)
else FConnectionPoint := nil;
end;
Ʉɨɝɞɚ ɫɨɡɞɚɟɬɫɹ ɤɨɦɩɨɧɟɧɬ ɚɜɬɨɦɚɬɢɡɚɰɢɢ ɫ ɩɨɞɞɟɪɠɤɨɣ ɫɨɛɵɬɢɣ, ɜ
ɛɢɛɥɢɨɬɟɤɟ ɬɢɩɨɜ ɜɜɨɞɹɬɫɹ ɞɜɚ ɢɧɬɟɪɮɟɣɫɚ: ɢɧɬɟɪɮɟɣɫ ɤɨɦɩɨɧɟɧɬɚ ɢ ɢɧ-
ɬɟɪɮɟɣɫ ɞɢɫɩɟɬɱɟɪɢɡɚɰɢɢ ɫɨɛɵɬɢɣ (ɨɛɵɱɧɨ ɭ ɧɟɝɨ ɨɤɨɧɱɚɧɢɟ Events).
ɉɪɢɦɟɱɚɧɢɟ 5.3.
ɂɧɬɟɪɮɟɣɫɨɦ ɫɨɛɵɬɢɣ ɦɨɠɟɬ ɛɵɬɶ ɥɸɛɨɣ ɢɧ-
ɬɟɪɮɟɣɫ ɞɢɫɩɟɬɱɟɪɢɡɚɰɢɢ, ɧɨ ɬɨɝɞɚ ɩɪɢɞɟɬɫɹ ɜɪɭɱɧɭɸ ɟɝɨ ɭɫɬɚɧɨɜɢɬɶ ɜ
ɋɨ-ɤɥɚɫɫ (ɡɚɤɥɚɞɤɚ implements ɜ ɛɢɛɥɢɨɬɟɤɟ ɬɢɩɨɜ) ɢ ɡɚɞɚɬɶ ɟɦɭ ɡɧɚɱɟ-
ɧɢɹ Source ɢ Default (ɨɫɧɨɜɧɨɣ ɢɧɬɟɪɮɟɣɫ ɛɭɞɟɬ ɩɨɞɞɟɪɠɢɜɚɬɶ Default).
FɋonnectionPoints – ɚɝɪɟɝɢɪɨɜɚɧɧɵɣ ɨɛɴɟɤɬ, ɜ ɤɨɬɨɪɨɦ ɪɟɚɥɢɡɨɜɚɧ
ɢɧɬɟɪɮɟɣɫ IConnectionPointContainer, ɤɨɬɨɪɵɣ ɧɟɨɛɯɨɞɢɦ ɞɥɹ ɩɨɞɞɟɪɠɤɢ
ɦɟɯɚɧɢɡɦɚ ɫɨɛɵɬɢɣ.
FConnectionPoint – ɷɥɟɦɟɧɬ ɨɛɴɟɤɬɚ FɋonnectionPoints.
FSinkList – ɫɩɢɫɨɤ ɢɧɬɟɪɮɟɣɫɨɜ ɤɥɢɟɧɬɨɜ.
FEvents – ɢɧɬɟɪɮɟɣɫ ɨɛɪɚɬɧɨɝɨ ɜɵɡɨɜɚ. ȿɫɥɢ ɧɭɠɧɨ ɜɵɡɜɚɬɶ ɮɭɧɤ-
ɰɢɸ, ɨɬɜɟɱɚɸɳɭɸ ɡɚ ɤɚɤɨɟ-ɥɢɛɨ ɫɨɛɵɬɢɟ, ɬɨ ɧɟɨɛɯɨɞɢɦɨ ɧɚɩɢɫɚɬɶ ɫɥɟ-
ɞɭɸɳɢɣ ɤɨɞ:
FEvents.< ɮɭɧɤɰɢɹ ɫɨɛɵɬɢɹ>;
ɉɪɢɦɟɱɚɧɢɟ 5.4.
ɉɟɪɟɞ ɬɟɦ, ɤɚɤ ɜɵɡɜɚɬɶ ɮɭɧɤɰɢɸ ɫɨɛɵɬɢɹ, ɢɫ-
ɩɨɥɶɡɭɣɬɟ ɩɪɨɜɟɪɤɭ ɧɚɥɢɱɢɹ ɫɫɵɥɤɢ ɜ ɩɟɪɟɦɟɧɧɨɣ FEvents:
if Assigned(FEvents) then FEvents.< ɮɭɧɤɰɢɹ ɫɨɛɵɬɢɹ>;
ɗɬɨ ɧɟɨɛɯɨɞɢɦɨ ɞɥɹ ɢɡɛɟɠɚɧɢɹ ɨɲɢɛɨɤ, ɤɨɝɞɚ ɤɨɦɩɨɧɟɧɬ ɧɟ ɩɨɥɭ-
ɱɢɥ ɨɬ ɤɥɢɟɧɬɚ ɢɧɬɟɪɮɟɣɫ ɨɛɪɚɬɧɨɝɨ ɜɵɡɨɜɚ.
51
ȼ Delphi ɚɜɬɨɦɚɬɢɱɟɫɤɢ ɫɨɡɞɚɟɬɫɹ ɩɪɨɝɪɚɦɦɧɵɣ ɤɨɞ, ɩɨɞɞɟɪɠɢ-
ɜɚɸɳɢɣ ɦɟɯɚɧɢɡɦ ɨɛɪɚɛɨɬɤɢ ɫɨɛɵɬɢɣ ɬɨɥɶɤɨ ɞɥɹ ɩɟɪɜɨɝɨ ɜ ɩɨɪɹɞɤɟ
ɩɨɞɤɥɸɱɟɧɢɣ ɤɥɢɟɧɬɚ. ɑɬɨɛɵ ɛɵɥɚ ɜɨɡɦɨɠɧɨɫɬɶ ɩɟɪɟɞɚɜɚɬɶ ɫɨɛɵɬɢɹ
ɦɧɨɠɟɫɬɜɭ ɩɨɞɤɥɸɱɟɧɧɵɯ ɤɥɢɟɧɬɨɜ, ɧɭɠɧɨ ɜɧɟɫɬɢ ɧɟɤɨɬɨɪɵɟ ɢɡɦɟɧɟ-
ɧɢɹ ɜ ɩɪɨɝɪɚɦɦɧɵɣ ɤɨɞ.
ȼɨ-ɩɟɪɜɵɯ, ɞɥɹ ɜɨɡɦɨɠɧɨɫɬɢ ɩɨɥɭɱɟɧɢɹ ɫɫɵɥɤɢ ɧɚ ɞɚɧɧɵɣ COM-
ɫɟɪɜɟɪ ɫ ɩɨɦɨɳɶɸ ɮɭɧɤɰɢɢ GetOleObject ɟɝɨ ɧɭɠɧɨ ɡɚɪɟɝɢɫɬɪɢɪɨɜɚɬɶ ɜ
ɬɚɛɥɢɰɟ ɜɵɩɨɥɧɹɟɦɵɯ ɨɛɴɟɤɬɨɜ Windows. Ⱦɥɹ ɷɬɢɯ ɰɟɥɟɣ ɜ ɤɥɚɫɫ ɩɪɨɟɤ-
ɬɢɪɭɟɦɨɝɨ ɤɨɦɩɨɧɟɧɬɚ ɧɭɠɧɨ ɞɨɛɚɜɢɬɶ ɩɨɥɟ FObjectID: integer ɞɥɹ ɯɪɚɧɟ-
ɧɢɹ ɢɞɟɧɬɢɮɢɤɚɬɨɪɚ, ɚ ɜ ɩɪɨɰɟɞɭɪɭ Intitialize ɞɨɛɚɜɢɬɶ ɩɪɨɰɟɞɭɪɭ ɪɟɝɢɫɬ-
ɪɚɰɢɢ ɤɨɦɩɨɧɟɧɬɚ:
RegisterActiveObject(self as Iunknown, <CLSID ɤɨɦɩɨɧɟɧɬɚ>, AC-
TIVEOBJECT_WEAK, FObjectID)
Ⱦɥɹ ɬɨɝɨ ɱɬɨɛɵ ɭɞɚɥɢɬɶ ɤɨɦɩɨɧɟɧɬ ɢɡ ɬɚɛɥɢɰɵ ɜɵɩɨɥɧɹɟɦɵɯ ɨɛɴɟɤ-
ɬɨɜ Windows, ɧɭɠɧɨ ɫɨɡɞɚɬɶ ɦɟɬɨɞ Destroy ɢ ɜ ɧɟɦ ɜɵɡɜɚɬɶ ɮɭɧɤɰɢɸ
RevokeActiveObject:
destructor <ɢɦɹ ɤɨɦɩɨɧɟɧɬɚ>.Destroy;
begin
RevokeActiveObject(FObjectID, nil);
end;
ɉɪɢ ɫɨɡɞɚɧɢɢ ɷɥɟɦɟɧɬɚ FConnectionPoint ɫ ɩɨɦɨɳɶɸ ɦɟɬɨɞɚ
CreateConnectionPoint ɜ ɤɚɱɟɫɬɜɟ ɩɪɟɞɩɨɫɥɟɞɧɟɝɨ ɩɚɪɚɦɟɬɪɚ ɩɟɪɟɞɚɟɬɫɹ ɧɟ
ckSingle (ɡɚɞɚɧɧɵɣ ɩɨ ɭɦɨɥɱɚɧɢɸ), ɚ ckMulti. ȼ ɢɬɨɝɟ ɪɟɚɥɢɡɚɰɢɹ ɦɟɬɨɞɚ
Initialize ɛɭɞɟɬ ɫɥɟɞɭɸɳɚɹ:
procedure <ɢɦɹ ɤɨɦɩɨɧɟɧɬɚ>.Initialize;
begin
inherited Initialize;
FConnectionPoints := TConnectionPoints.Create(Self);
if AutoFactory.EventTypeInfo <> nil then
FConnectionPoint := FConnectionPoints.CreateConnectionPoint
(AutoFactory.EventIID, ckMulti, EventConnect)
else FConnectionPoint := nil;
RegisterActiveObject(self as Iunknown, <CLSID ɤɨɦɩɨɧɟɧɬɚ>, AC-
TIVEOBJECT_WEAK, FObjectID)
end;
Ⱦɥɹ ɬɨɝɨ ɱɬɨɛɵ ɨɬɫɥɟɠɢɜɚɬɶ ɦɧɨɠɟɫɬɜɨ ɩɚɪɚɥɥɟɥɶɧɵɯ ɩɨɞɤɥɸɱɟɧɢɣ,
ɧɭɠɧɨ ɪɟɚɥɢɡɨɜɚɬɶ ɫɥɟɞɭɸɳɭɸ ɮɭɧɤɰɢɸ:
function <ɢɦɹ ɤɨɦɩɨɧɟɧɬɚ>.GetEnumerator: IEnumConnections;
var
52
Intialize � EventSinkChanged ������������� ����������� ������ �������-           � Delphi ������������� ��������� ����������� ���, ��������-
��������� Delphi:                                                            ������ �������� ��������� ������� ������ ��� ������� � �������
    procedure <��� ����������>.EventSinkChanged(const                        ����������� �������. ����� ���� ����������� ���������� �������
                                                   EventSink: IUnknown);     ��������� ������������ ��������, ����� ������ ��������� ������-
    begin                                                                    ��� � ����������� ���.
       FEvents := EventSink as <��������� �������>;                              ��-������, ��� ����������� ��������� ������ �� ������ COM-
       if FConnectionPoint <> nil then                                       ������ � ������� ������� GetOleObject ��� ����� ���������������� �
           FSinkList := FConnectionPoint.SinkList;                           ������� ����������� �������� Windows. ��� ���� ����� � ����� �����-
    end;                                                                     ��������� ���������� ����� �������� ���� FObjectID: integer ��� �����-
                                                                             ��� ��������������, � � ��������� Intitialize �������� ��������� ������-
    procedure <��� ����������>.Initialize;                                   ����� ����������:
    begin                                                                        RegisterActiveObject(self as Iunknown, , AC-
       inherited Initialize;                                                                          TIVEOBJECT_WEAK, FObjectID)
       FConnectionPoints := TConnectionPoints.Create(Self);                      ��� ���� ����� ������� ��������� �� ������� ����������� �����-
       if AutoFactory.EventTypeInfo <> nil then                              ��� Windows, ����� ������� ����� Destroy � � ��� ������� �������
           FConnectionPoint := FConnectionPoints.CreateConnectionPoint(      RevokeActiveObject:
                             AutoFactory.EventIID, ckSingle, EventConnect)
       else FConnectionPoint := nil;                                             destructor <��� ����������>.Destroy;
    end;                                                                         begin
    ����� ��������� ��������� ������������� � ���������� �������, �                 RevokeActiveObject(FObjectID, nil);
���������� ����� �������� ��� ����������: ��������� ���������� � ��-             end;
������� ��������������� ������� (������ � ���� ��������� Events).                  ��� �������� �������� FConnectionPoint � ������� ������
     ���������� 5.3. ����������� ������� ����� ���� ����� ��-                CreateConnectionPoint � �������� �������������� ��������� ���������� ��
������� ���������������, �� ����� �������� ������� ��� ���������� �          ckSingle (�������� �� ���������), � ckMulti. � ����� ���������� ������
��-����� (�������� implements � ���������� �����) � ������ ��� �����-        Initialize ����� ���������:
��� Source � Default (�������� ��������� ����� ������������ Default).            procedure <��� ����������>.Initialize;
    F�onnectionPoints – �������������� ������, � ������� ����������              begin
��������� IConnectionPointContainer, ������� ��������� ��� ���������                inherited Initialize;
��������� �������.                                                                  FConnectionPoints := TConnectionPoints.Create(Self);
    FConnectionPoint – ������� ������� F�onnectionPoints.                           if AutoFactory.EventTypeInfo <> nil then
    FSinkList – ������ ����������� ��������.                                            FConnectionPoint := FConnectionPoints.CreateConnectionPoint
    FEvents – ��������� ��������� ������. ���� ����� ������� ����-                                        (AutoFactory.EventIID, ckMulti, EventConnect)
���, ���������� �� �����-���� �������, �� ���������� �������� ���-                  else FConnectionPoint := nil;
������ ���:                                                                         RegisterActiveObject(self as Iunknown, , AC-
                                                                                                            TIVEOBJECT_WEAK, FObjectID)
    FEvents.< ������� �������>;                                                  end;
    ���������� 5.4. ����� ���, ��� ������� ������� �������, ��-                  ��� ���� ����� ����������� ��������� ������������ �����������,
��������� �������� ������� ������ � ���������� FEvents:                      ����� ����������� ��������� �������:
    if Assigned(FEvents) then FEvents.< ������� �������>;                        function <��� ����������>.GetEnumerator: IEnumConnections;
     ��� ���������� ��� ��������� ������, ����� ��������� �� ����-
��� �� ������� ��������� ��������� ������.                                       var
                                    51                                                                           52