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

UptoLike

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

Container: IConnectionPointContainer;
ConnectionPoint: IconnectionPoint;
begin
OleCheck(QueryInterface(IConnectionPointContainer, Container));
OleCheck(Container.FindConnectionPoint(AutoFactory.EventIID,
ConnectionPoint));
ConnectionPoint.EnumConnections(result);
end;
Ⱦɚɧɧɚɹ ɮɭɧɤɰɢɹ ɩɨɡɜɨɥɹɟɬ ɩɨɥɭɱɢɬɶ ɞɚɧɧɵɟ ɨɬ ɫɱɟɬɱɢɤɚ ɩɨɞɤɥɸɱɟ-
ɧɢɣ, ɩɨɫɥɟ ɱɟɝɨ ɧɭɠɧɨ «ɩɪɨɣɬɢɫɶ» ɩɨ ɜɫɟɦ ɩɨɞɤɥɸɱɟɧɢɹɦ:
var
Enum: IEnumConnections;
ConnectData: TConnectData;
Fetched: Cardinal;
<………………………>
begin {ɦɟɬɨɞ ɪɚɡɪɚɛɚɬɵɜɚɟɦɨɝɨ ɤɨɦɩɨɧɟɧɬɚ}
<…………………………….>
{ɨɛɪɚɛɨɬɤɚ ɫɨɛɵɬɢɣ ɩɪɢ ɩɨɞɤɥɸɱɟɧɢɢ ɦɧɨɠɟɫɬɜɚ ɤɥɢɟɧɬɨɜ}
Enum:=GetEnumerator;
if Enum <> nil then
begin
while Enum.Next(1,ConnectData,@Fetched) = S_OK do
if ConnectData.pUnk <> nil then
(ConnectData.pUnk as <ɢɧɬɟɪɮɟɣɫ ɫɨɛɵɬɢɣ>).<ɮɭɧɤɰɢɹ ɫɨɛɵ-
ɬɢɣ>
end;
<…………………………….>
end;
Ɋɚɫɫɦɨɬɪɢɦ ɞɚɥɟɟ ɪɟɚɥɢɡɚɰɢɸ ɩɪɢɥɨɠɟɧɢɣ, ɢɫɩɨɥɶɡɭɸɳɢɯ COM-
ɫɟɪɜɟɪɵ, ɩɨɞɞɟɪɠɢɜɚɸɳɢɟ ɫɨɛɵɬɢɹ.
ɉɪɢɦɟɱɚɧɢɟ 5.5.
Ɋɟɚɥɢɡɚɰɢɹ ɩɪɢɥɨɠɟɧɢɣ-ɤɥɢɟɧɬɨɜ ɞɥɹ COM-
ɫɟɪɜɟɪɨɜ, ɩɨɞɞɟɪɠɢɜɚɸɳɢɯ ɫɨɛɵɬɢɹ, ɭɩɪɨɳɟɧɚ ɬɟɦ, ɱɬɨ ɫ ɩɨɦɨɳɶɸ
ɞɢɚɥɨɝɨɜɨɝɨ ɨɤɧɚ ɢɦɩɨɪɬɚ ɛɢɛɥɢɨɬɟɤɢ ɬɢɩɨɜ ɦɨɠɧɨ ɫɝɟɧɟɪɢɪɨɜɚɬɶ
ɤɨɦɩɨɧɟɧɬ Delphi, ɹɜɥɹɸɳɢɣɫɹ ɨɛɨɥɨɱɤɨɣ, ɩɨɞɞɟɪɠɢɜɚɸɳɟɣ ɜɫɟ ɫɜɨɣɫɬ-
ɜɚ ɢ ɦɟɬɨɞɵ ɤɨɦɩɨɧɟɧɬɚ COM-ɫɟɪɜɟɪɚ.
Ⱦɥɹ ɬɨɝɨ ɱɬɨɛɵ ɨɛɪɚɛɚɬɵɜɚɬɶ ɫɨɛɵɬɢɹ ɩɨɞɤɥɸɱɟɧɧɨɝɨ ɤɨɦɩɨɧɟɧɬɚ,
ɧɟɨɛɯɨɞɢɦɨ ɫɨɡɞɚɬɶ ɜ ɩɪɢɥɨɠɟɧɢɢ ɨɛɴɟɤɬ, ɩɨɞɞɟɪɠɢɜɚɸɳɢɣ ɢɧɬɟɪɮɟɣɫ,
ɫɯɨɠɢɣ ɫ ɢɧɬɟɪɮɟɣɫɨɦ ɫɨɛɵɬɢɣ ɤɨɦɩɨɧɟɧɬɚ. Ɉɬɥɢɱɢɟ ɞɚɧɧɵɯ ɢɧɬɟɪɮɟɣ-
ɫɨɜ ɡɚɤɥɸɱɚɟɬɫɹ ɜ ɬɨɦ, ɱɬɨ ɜ ɤɨɦɩɨɧɟɧɬɟ ɢɫɩɨɥɶɡɭɟɬɫɹ ɢɧɬɟɪɮɟɣɫ ɞɢɫɩɟɬ-
ɱɟɪɢɡɚɰɢɢ (dispinterface), ɚ ɜ ɩɪɢɥɨɠɟɧɢɢɨɛɵɱɧɵɣ ɢɧɬɟɪɮɟɣɫ.
53
ɉɪɢɦɟɱɚɧɢɟ 5.6. Ɉɛɪɚɬɢɬɟ ɜɧɢɦɚɧɢɟ, ɱɬɨ ɢɧɬɟɪɮɟɣɫɵ ɤɨɦɩɨɧɟɧɬɚ
ɢ ɨɛɴɟɤɬɚ ɜ ɩɪɢɥɨɠɟɧɢɢ ɞɨɥɠɧɵ ɢɦɟɬɶ ɨɞɢɧɚɤɨɜɵɣ IID. Ɍɚɤɠɟ ɞɨɥɠɧɚ
ɫɨɜɩɚɞɚɬɶ ɧɭɦɟɪɚɰɢɹ ɦɟɬɨɞɨɜ ɢɧɬɟɪɮɟɣɫɨɜ.
ɉɪɢ ɩɨɞɤɥɸɱɟɧɢɢ ɩɪɢɥɨɠɟɧɢɹ ɤ ɤɨɦɩɨɧɟɧɬɭ ɧɭɠɧɨ ɜɵɩɨɥɧɢɬɶ ɫɥɟ-
ɞɭɸɳɢɣ ɩɪɨɝɪɚɦɦɧɵɣ ɤɨɞ:
with <ɢɧɬɟɪɮɟɣɫ ɤɨɦɩɨɧɟɧɬɚ> as IConnectionPointContainer do
begin
FindConnectionPoint(<IID ɢɧɬɟɪɮɟɣɫɚ ɫɨɛɵɬɢɣ>, ESink);
OleCheck(ESink.Advise(<ɤɨɦɩɨɧɟɧɬ ɨɛɪɚɛɨɬɤɢ ɫɨɛɵɬɢɣ> as
IDispatch, ConnectId));
end;
ȼ ɞɚɧɧɨɦ ɩɪɨɝɪɚɦɦɧɨɦ ɤɨɞɟ ɜɵɩɨɥɧɹɸɬɫɹ ɫɥɟɞɭɸɳɢɟ ɞɟɣɫɬɜɢɹ:
1. ɂɳɟɬɫɹ ɬɨɱɤɚ «ɜɯɨɞɚ» ɞɥɹ ɫɨɨɬɜɟɬɫɬɜɭɸɳɟɝɨ ɨɛɪɚɛɨɬɱɢɤɚ ɫɨɛɵ-
ɬɢɣ.
2. ȼ ɤɨɦɩɨɧɟɧɬ ɩɟɪɟɞɚɟɬɫɹ ɭɤɚɡɚɬɟɥɶ ɧɚ ɢɧɬɟɪɮɟɣɫ ɨɛɴɟɤɬɚ ɩɨɞɤɥɸ-
ɱɟɧɢɹ ɞɥɹ ɨɛɪɚɛɨɬɤɢ ɫɨɛɵɬɢɣ. Ɏɭɧɤɰɢɹ ESink.Advise ɜ ɩɚɪɚɦɟɬɪɟ
ConnectId ɜɨɡɜɪɚɳɚɟɬ ɢɞɟɧɬɢɮɢɤɚɬɨɪ ɫɨɟɞɢɧɟɧɢɹ, ɤɨɬɨɪɵɣ ɛɭɞɟɬ
ɢɫɩɨɥɶɡɨɜɚɬɶɫɹ ɞɥɹ ɪɚɡɪɵɜɚ ɫɜɹɡɢ ɤɥɢɟɧɬɚ ɫ ɫɟɪɜɟɪɨɦ.
ɉɪɢ ɡɚɜɟɪɲɟɧɢɢ ɪɚɛɨɬɵ ɫ ɤɨɦɩɨɧɟɧɬɨɦ ɧɭɠɧɨ ɪɚɡɨɪɜɚɬɶ ɫɜɹɡɶ ɦɟ-
ɠɞɭ ɤɥɢɟɧɬɨɦ ɢ ɫɟɪɜɟɪɨɦ. Ⱦɥɹ ɷɬɢɯ ɰɟɥɟɣ ɢɫɩɨɥɶɡɭɟɬɫɹ ɫɥɟɞɭɸɳɢɣ ɩɪɨ-
ɝɪɚɦɦɧɵɣ ɤɨɞ:
with <ɢɧɬɟɮɟɣɫ ɤɨɦɩɨɧɟɧɬɚ> as IConnectionPointContainer do
begin
FindConnectionPoint(<IID ɢɧɬɟɪɮɟɣɫɚ ɫɨɛɵɬɢɣ>, ESink);
ESink.UnAdvise(ConnectId);
end;
Ⱥɧɚɥɨɝɢɱɧɨ, ɤɚɤ ɢ ɩɪɢ ɩɨɞɤɥɸɱɟɧɢɢ, ɢɳɟɬɫɹ ɬɨɱɤɚ «ɜɯɨɞɚ» ɞɥɹ ɫɨ-
ɨɬɜɟɬɫɬɜɭɸɳɟɝɨ ɨɛɪɚɛɨɬɱɢɤɚ ɫɨɛɵɬɢɣ, ɡɚɬɟɦ ɜɵɡɵɜɚɟɬɫɹ ɩɪɨɰɟɞɭɪɚ ɪɚɡ-
ɪɵɜɚ ɫɨɟɞɢɧɟɧɢɹ ESink.UnAdvise, ɜ ɤɨɬɨɪɭɸ ɩɟɪɟɞɚɟɬɫɹ ɢɞɟɧɬɢɮɢɤɚɬɨɪ
ɫɨɟɞɢɧɟɧɢɹ, ɩɨɥɭɱɟɧɧɵɣ ɜɨ ɜɪɟɦɹ ɩɨɞɤɥɸɱɟɧɢɹ ɤ ɫɟɪɜɟɪɭ.
ɉɪɢɦɟɱɚɧɢɟ 5.7.
ɇɟ ɡɚɛɵɜɚɣɬɟ ɨɬɤɥɸɱɚɬɶɫɹ ɨɬ ɫɟɪɜɟɪɨɜ, ɢɧɚɱɟ
ɫɢɫɬɟɦɚ COM ɛɭɞɟɬ ɫɱɢɬɚɬɶ, ɱɬɨ ɤɨɦɩɨɧɟɧɬ COM-ɫɟɪɜɟɪɚ ɟɳɟ ɢɫɩɨɥɶ-
ɡɭɟɬɫɹ ɢ ɧɟ ɫɦɨɠɟɬ ɟɝɨ ɜɵɝɪɭɡɢɬɶ.
VI. Ⱥɜɬɨɦɚɬɢɡɚɰɢɹ ɩɪɢɥɨɠɟɧɢɣ Microsoft Office
ȼɨ ɦɧɨɝɢɯ ɩɪɢɥɨɠɟɧɢɹɯ, ɫɜɹɡɚɧɧɵɯ ɫ ɮɨɪɦɢɪɨɜɚɧɢɟɦ ɞɨɤɭɦɟɧɬɨɜ ɢ
ɨɬɱɟɬɨɜ, ɧɟɪɟɞɤɨ ɩɪɢɦɟɧɹɸɬ ɫɟɪɜɢɫɵ, ɩɪɟɞɨɫɬɚɜɥɹɟɦɵɟ Microsoft Office.
ɉɪɨɝɪɚɦɦɵ, ɩɪɟɞɨɫɬɚɜɥɹɟɦɵɟ ɜ ɞɚɧɧɨɦ ɩɚɤɟɬɟ, ɪɚɡɪɚɛɨɬɚɧɵ ɩɨ ɬɟɯɧɨɥɨ-
54
       Container: IConnectionPointContainer;                                 ���������� 5.6. �������� ��������, ��� ���������� ����������
       ConnectionPoint: IconnectionPoint;                                � ������� � ���������� ������ ����� ���������� IID. ����� ������
    begin                                                                ��������� ��������� ������� �����������.
       OleCheck(QueryInterface(IConnectionPointContainer, Container));       ��� ����������� ���������� � ���������� ����� ��������� ���-
       OleCheck(Container.FindConnectionPoint(AutoFactory.EventIID,      ������ ����������� ���:
                  ConnectionPoint));
       ConnectionPoint.EnumConnections(result);                              with <��������� ����������> as IConnectionPointContainer do
    end;                                                                     begin
                                                                                FindConnectionPoint(, ESink);
     ������ ������� ��������� �������� ������ �� �������� ��������-             OleCheck(ESink.Advise(<��������� ��������� �������> as
���, ����� ���� ����� «��������» �� ���� ������������:                                                 IDispatch, ConnectId));
    var                                                                      end;
          Enum: IEnumConnections;
          ConnectData: TConnectData;                                         � ������ ����������� ���� ����������� ��������� ��������:
          Fetched: Cardinal;                                                 1. ������ ����� «�����» ��� ���������������� ����������� ����-
          <………………………>                                                         ���.
                                                                             2. � ��������� ���������� ��������� �� ��������� ������� ������-
    begin {����� ���������������� ����������}                                 ����� ��� ��������� �������. ������� ESink.Advise � ���������
       <…………………………….>                                                         ConnectId ���������� ������������� ����������, ������� �����
       {��������� ������� ��� ����������� ��������� ��������}                 �������������� ��� ������� ����� ������� � ��������.
       Enum:=GetEnumerator;
       if Enum <> nil then                                                   ��� ���������� ������ � ����������� ����� ��������� ����� ��-
       begin                                                             ��� �������� � ��������. ��� ���� ����� ������������ ��������� ���-
           while Enum.Next(1,ConnectData,@Fetched) = S_OK do             �������� ���:
                 if ConnectData.pUnk <> nil then                             with <�������� ����������> as IConnectionPointContainer do
         (ConnectData.pUnk as <��������� �������>).<������� ����-            begin
���>                                                                            FindConnectionPoint(, ESink);
       end;                                                                     ESink.UnAdvise(ConnectId);
       <…………………………….>                                                        end;
    end;
                                                                             ����������, ��� � ��� �����������, ������ ����� «�����» ��� ��-
    ���������� ����� ���������� ����������, ������������ COM-            �������������� ����������� �������, ����� ���������� ��������� ���-
�������, �������������� �������.                                         ���� ���������� ESink.UnAdvise, � ������� ���������� �������������
                                                                         ����������, ���������� �� ����� ����������� � �������.
     ���������� 5.5. ���������� ����������-�������� ��� COM-
��������, �������������� �������, �������� ���, ��� � �������                ���������� 5.7. �� ��������� ����������� �� ��������, �����
����������� ���� ������� ���������� ����� ����� �������������            ������� COM ����� �������, ��� ��������� COM-������� ��� ������-
��������� Delphi, ���������� ���������, �������������� ��� ������-       ������ � �� ������ ��� ���������.
�� � ������ ���������� COM-�������.
     ��� ���� ����� ������������ ������� ������������� ����������,           VI. ������������� ���������� Microsoft Office
���������� ������� � ���������� ������, �������������� ���������,
                                                                             �� ������ �����������, ��������� � ������������� ���������� �
������ � ����������� ������� ����������. ������� ������ ��������-
                                                                         �������, ������� ��������� �������, ��������������� Microsoft Office.
��� ����������� � ���, ��� � ���������� ������������ ��������� ������-
                                                                         ���������, ��������������� � ������ ������, ����������� �� �������-
��������� (dispinterface), � � ���������� – ������� ���������.
                                       53                                                                 54