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

UptoLike

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

2) ɧɟ ɬɪɟɛɭɟɬɫɹ ɢɦɩɨɪɬɢɪɨɜɚɬɶ ɢ ɩɨɞɤɥɸɱɚɬɶ ɩɪɨɝɪɚɦɦɧɵɣ ɦɨɞɭɥɶ ɫ
ɨɩɢɫɚɧɢɟɦ ɢɧɬɟɪɮɟɣɫɨɜ ɢ ɬɢɩɨɜ ɞɚɧɧɵɯ, ɩɪɢɦɟɧɹɟɦɵɯ ɤɨɦɩɨɧɟɧ-
ɬɨɦ;
3) ɜ ɧɟɤɨɬɨɪɵɯ ɦɟɬɨɞɚɯ ɤɨɦɩɨɧɟɧɬɨɜ ɩɚɪɚɦɟɬɪɵ ɨɩɪɟɞɟɥɟɧɵ ɩɨ ɭɦɨɥ-
ɱɚɧɢɸ, ɧɨ ɩɪɢ ɪɚɧɧɟɦ ɫɜɹɡɵɜɚɧɢɢ ɤɨɦɩɢɥɹɬɨɪ Delphi ɧɟ ɞɨɩɭɫɬɢɬ
ɜɨɡɦɨɠɧɨɫɬɢ «ɨɩɭɫɬɢɬɶ» ɞɚɧɧɵɟ ɩɚɪɚɦɟɬɪɵ. ɇɚɩɪɢɦɟɪ, ɩɭɫɬɶ ɟɫɬɶ
ɩɟɪɟɦɟɧɧɚɹ Word, ɜ ɤɨɬɨɪɨɣ ɯɪɚɧɢɬɫɹ ɭɤɚɡɚɬɟɥɶ ɧɚ ɤɨɦɩɨɧɟɧɬ Mi-
crosoft Word. ɑɬɨɛɵ ɫɨɡɞɚɬɶ ɧɨɜɵɣ ɞɨɤɭɦɟɧɬ ɩɪɢ ɩɨɡɞɧɟɦ ɫɜɹɡɵɜɚ-
ɧɢɢ, ɞɨɫɬɚɬɨɱɧɨ ɧɚɩɢɫɚɬɶ ɨɩɟɪɚɬɨɪ:
Word.Documents.Add
ɉɪɢ ɪɚɧɧɟɦ ɫɜɹɡɵɜɚɧɢɢ ɩɪɢɞɟɬɫɹ ɜɵɡɵɜɚɬɶ ɞɚɧɧɭɸ ɮɭɧɤɰɢɸ ɫ ɩɚ-
ɪɚɦɟɬɪɚɦɢ:
Word.Documents.Add(Template, NewTemplate, DocumentType, Visi-
ble).
5.2. ɂɧɬɟɪɮɟɣɫɵ ɞɢɫɩɟɬɱɟɪɢɡɚɰɢɢ
Ɇɟɯɚɧɢɡɦ ɩɨɡɞɧɟɝɨ ɫɜɹɡɵɜɚɧɢɹ ɪɟɚɥɢɡɭɟɬɫɹ ɜ ɫɚɦɢɯ ɤɨɦɩɨɧɟɧɬɚɯ
ɚɜɬɨɦɚɬɢɡɚɰɢɢ, ɤɨɬɨɪɵɟ ɨɛɹɡɚɧɵ ɩɨɞɞɟɪɠɢɜɚɬɶ ɢɧɬɟɪɮɟɣɫ IDispatch:
IDispatch = interface(IUnknown)
['{00020400-0000-0000-C000-000000000046}']
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HRe-
sult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer; Name-
Count, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Inte-
ger; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer):
HResult; stdcall;
end;
ɉɪɢ ɨɛɪɚɳɟɧɢɢ ɤ ɦɟɬɨɞɭ ɢɧɬɟɪɮɟɣɫɚ ɤɨɦɩɨɧɟɧɬɚ ɜ ɦɟɬɨɞɟ ɩɨɡɞɧɟɝɨ
ɫɜɹɡɵɜɚɧɢɹ ɜɵɩɨɥɧɹɸɬɫɹ ɫɥɟɞɭɸɳɢɟ ɞɟɣɫɬɜɢɹ:
1) ɢɦɹ ɜɵɡɵɜɚɟɦɨɣ ɩɪɨɰɟɞɭɪɵ ɩɟɪɟɞɚɟɬɫɹ ɜ ɦɟɬɨɞ GetIDsOfNames,
ɤɨɬɨɪɚɹ ɜɨɡɜɪɚɳɚɟɬ ɱɢɫɥɨɜɨɣ ɢɞɟɧɬɢɮɢɤɚɬɨɪ, ɨɞɧɨɡɧɚɱɧɨ ɫɨɨɬ-
ɜɟɬɫɬɜɭɸɳɢɣ ɢɦɟɧɢ ɦɟɬɨɞɚ ɫɟɪɜɟɪɚ;
2) ɱɢɫɥɨɜɨɣ ɢɞɟɧɬɢɮɢɤɚɬɨɪ ɩɟɪɟɞɚɟɬɫɹ ɜ Invoke ɞɥɹ ɩɨɥɭɱɟɧɢɹ ɚɞɪɟ-
ɫɚ ɧɚ ɜɵɡɵɜɚɟɦɵɣ ɦɟɬɨɞ ɢɧɬɟɪɮɟɣɫɚ.
45
ɉɪɨɦɟɠɭɬɨɱɧɵɦ ɡɜɟɧɨɦ ɦɟɠɞɭ ɢɧɬɟɪɮɟɣɫɚɦɢ ɢ ɩɟɪɟɦɟɧɧɵɦɢ ɬɢɩɚ
Variant ɹɜɥɹɸɬɫɹ ɢɧɬɟɪɮɟɣɫɵ ɞɢɫɩɟɬɱɟɪɢɡɚɰɢɢ (dispinterface). ɂɧɬɟɪ-
ɮɟɣɫɵ ɞɢɫɩɟɬɱɟɪɢɡɚɰɢɢ ɨɩɢɫɵɜɚɸɬɫɹ ɩɨɱɬɢ ɬɚɤ ɠɟ, ɤɚɤ ɢ ɨɛɵɱɧɵɟ ɢɧ-
ɬɟɪɮɟɣɫɵ:
IMyInterfase=interface(IDispatch)
[<IID ɢɧɬɟɪɮɟɣɫɚ>]
{<ɦɟɬɨɞ ɢɧɬɟɪɮɟɣɫɚ>; safecall;}
end;
IMyInterfaseDisp=dispinterface
[<IID ɢɧɬɟɪɮɟɣɫɚ>]
{<ɦɟɬɨɞ ɢɧɬɟɪɮɟɣɫɚ>; dispid <ɱɢɫɥɨɜɨɣ ɢɞɟɧɬɢɮɢɤɚɬɨɪ ɦɟ-
ɬɨɞɚ>;}
end;
IID ɢɧɬɟɪɮɟɣɫɚ IMyInterface ɢ IMyInterfaceDisp ɨɛɹɡɚɬɟɥɶɧɨ ɞɨɥɠɧɵ
ɛɵɬɶ ɨɞɢɧɚɤɨɜɵɦɢ. Ɇɟɬɨɞɵ ɭ IMyInterfaceDisp ɹɜɥɹɸɬɫɹ ɨɬɨɛɪɚɠɟɧɢɟɦ
ɦɟɬɨɞɨɜ IMyInterface, ɧɨ ɜɦɟɫɬɨ safecall ɢɫɩɨɥɶɡɭɟɬɫɹ dispid ɞɥɹ ɬɨɝɨ,
ɱɬɨɛɵ ɡɚɞɚɬɶ ɦɟɬɨɞɭ ɫɨɛɫɬɜɟɧɧɵɣ ɱɢɫɥɨɜɨɣ ɢɞɟɧɬɢɮɢɤɚɬɨɪ.
ȼɫɟ ɦɟɬɨɞɵ ɫɟɪɜɟɪɚ ɚɜɬɨɦɚɬɢɡɚɰɢɢ ɞɨɥɠɧɵ ɜɨɡɜɪɚɳɚɬɶ ɡɧɚɱɟɧɢɟ ɬɢ-
ɩɚ HResult. ȼɨɡɜɪɚɳɚɟɦɨɟ ɡɧɚɱɟɧɢɟ ɹɜɥɹɟɬɫɹ ɢɧɞɢɤɚɬɨɪɨɦ, ɧɨɪɦɚɥɶɧɨ ɥɢ
ɡɚɜɟɪɲɢɥ ɦɟɬɨɞ ɡɚɩɪɨɝɪɚɦɦɢɪɨɜɚɧɧɭɸ ɜ ɧɟɦ ɨɩɟɪɚɰɢɸ, ɢɥɢ ɜɵɩɨɥɧɢɬɶ
ɟɟ ɧɟ ɭɞɚɥɨɫɶ. Ⱦɪɭɝɢɟ ɞɚɧɧɵɟ, ɩɨɥɭɱɟɧɧɵɟ ɜ ɪɟɡɭɥɶɬɚɬɟ ɪɚɛɨɬɵ ɮɭɧɤɰɢɢ,
ɜɨɡɜɪɚɳɚɸɬɫɹ ɱɟɪɟɡ ɩɚɪɚɦɟɬɪɵ ɫ ɦɨɞɢɮɢɤɚɬɨɪɨɦ out. Ⱦɢɪɟɤɬɢɜɚ safecall
ɢɧɫɬɪɭɤɬɢɪɭɟɬ ɤɨɦɩɢɥɹɬɨɪ Delphi ɚɜɬɨɦɚɬɢɱɟɫɤɢ ɫɨɡɞɚɬɶ ɜɨɤɪɭɝ ɜɫɟɯ ɦɟ-
ɬɨɞɨɜ ɫɜɨɟɝɨ ɪɨɞɚ ɨɛɨɥɨɱɤɭ ɜ ɜɢɞɟ ɤɨɧɫɬɪɭɤɰɢɢ try-except. Ⱦɚɧɧɵɟ ɫɨ-
ɝɥɚɲɟɧɢɹ ɜ Delphi ɨɩɪɟɞɟɥɟɧɵ ɩɨ ɭɦɨɥɱɚɧɢɸ, ɩɨɷɬɨɦɭ ɩɪɢ ɨɛɪɚɳɟɧɢɢ
ɢɥɢ ɪɟɚɥɢɡɚɰɢɢ ɤɨɦɩɨɧɟɧɬɚ ɚɜɬɨɦɚɬɢɡɚɰɢɢ ɦɟɬɨɞɵ ɟɝɨ ɢɧɬɟɪɮɟɣɫɨɜ ɜɵ-
ɝɥɹɞɹɬ ɤɚɤ ɨɛɵɱɧɵɟ ɦɟɬɨɞɵ
. ɇɚɩɪɢɦɟɪ:
//Ɍɚɤ ɞɨɥɠɟɧ ɜɵɝɥɹɞɟɬɶ ɦɟɬɨɞ ɢɧɬ-ɫɚ, ɩɪɨɢɡɜɨɞɧɨɝɨ ɨɬ IDspatch
function MyMethod(out param: <ɬɢɩ ɩɟɪɟɦɟɧɧɨɣ>): HResult; stdcall;
//Ɍɚɤ ɦɟɬɨɞ ɢɧɬ-ɫɚ, ɩɪɨɢɡɜɨɞɧɨɝɨ ɨɬ IDspatch, ɪɟɚɥɢɡɨɜɚɧ ɜ Delphi
function MyMethod: <ɬɢɩ ɩɟɪɟɦɟɧɧɨɣ>;
ȼ ɢɧɬɟɪɮɟɣɫɚɯ, ɩɨɞɞɟɪɠɢɜɚɸɳɢɯ IDispatch, ɦɨɠɧɨ ɡɚɞɚɜɚɬɶ ɧɟ ɬɨɥɶ-
ɤɨ ɦɟɬɨɞɵ, ɧɨ ɢ ɫɜɨɣɫɬɜɚ. ɋɜɨɣɫɬɜɚ ɩɨɯɨɠɢ ɧɚ ɩɟɪɟɦɟɧɧɵɟ, ɧɨ ɞɥɹ ɜɜɨɞɚ
ɢ ɜɵɜɨɞɚ ɞɚɧɧɵɯ ɜ ɫɜɨɣɫɬɜɚɯ ɢɫɩɨɥɶɡɭɸɬɫɹ ɮɭɧɤɰɢɢ, ɧɚɡɜɚɧɢɹ ɤɨɬɨɪɵɯ
ɨɛɵɱɧɨ ɧɚɱɢɧɚɸɬɫɹ ɫ ɩɪɟɮɢɤɫɨɜ Get_ (ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ) ɢ Set_ (ɞɥɹ ɡɚɩɢ-
ɫɢ) ɫɨɨɬɜɟɬɫɬɜɟɧɧɨ. ɋɜɨɣɫɬɜɚ ɦɨɝɭɬ ɛɵɬɶ ɞɨɫɬɭɩɧɵ ɧɟ ɬɨɥɶɤɨ ɧɚ ɱɬɟɧɢɟ ɢ
ɡɚɩɢɫɶ ɨɞɧɨɜɪɟɦɟɧɧɨ, ɧɨ ɢ ɬɨɥɶɤɨ ɧɚ ɱɬɟɧɢɟ ɢɥɢ ɬɨɥɶɤɨ ɧɚ ɡɚɩɢɫɶ. ɉɪɨ-
ɰɟɞɭɪɵ Get_ ɢ Set_, ɫɨɨɬɜɟɬɫɬɜɭɸɳɢɟ ɫɜɨɣɫɬɜɭ, ɨɫɬɚɸɬɫɹ ɞɨɫɬɭɩɧɵɦɢ
ɞɥɹ ɬɟɯ ɫɥɭɱɚɟɜ, ɤɨɝɞɚ ɜ ɤɚɤɨɦ-ɥɢɛɨ ɹɡɵɤɟ ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɹ ɪɟɚɥɢɡɚɰɢɹ
ɫɜɨɣɫɬɜ ɧɟ ɩɨɞɞɟɪɠɢɜɚɟɬɫɹ.
46
  2) �� ��������� ������������� � ���������� ����������� ������ �                  ������������� ������ ����� ������������ � ����������� ����
     ��������� ����������� � ����� ������, ����������� ��������-              Variant �������� ���������� ��������������� (dispinterface). �����-
     ���;                                                                     ����� ��������������� ����������� ����� ��� ��, ��� � ������� ��-
  3) � ��������� ������� ����������� ��������� ���������� �� ����-            ��������:
     �����, �� ��� ������ ���������� ���������� Delphi �� ��������                      IMyInterfase=interface(IDispatch)
     ����������� «��������» ������ ���������. ��������, ����� ����                         []
     ���������� Word, � ������� �������� ��������� �� ��������� Mi-                        {<����� ����������>; safecall;}
     crosoft Word. ����� ������� ����� �������� ��� ������� �������-                    end;
     ���, ���������� �������� ��������:
    Word.Documents.Add                                                                  IMyInterfaseDisp=dispinterface
                                                                                           []
    ��� ������ ���������� �������� �������� ������ ������� � ��-                           {<����� ����������>; dispid <�������� ������������� ��-
   ���������:                                                                 ����>;}
    Word.Documents.Add(Template, NewTemplate, DocumentType, Visi-                       end;
    ble).                                                                          IID ���������� IMyInterface � IMyInterfaceDisp ����������� ������
                                                                              ���� �����������. ������ � IMyInterfaceDisp �������� ������������
               5.2. ���������� ���������������                                ������� IMyInterface, �� ������ safecall ������������ dispid ��� ����,
                                                                              ����� ������ ������ ����������� �������� �������������.
    �������� �������� ���������� ����������� � ����� �����������                   ��� ������ ������� ������������� ������ ���������� �������� ��-
�������������, ������� ������� ������������ ��������� IDispatch:              �� HResult. ������������ �������� �������� �����������, ��������� ��
    IDispatch = interface(IUnknown)                                           �������� ����� ������������������� � ��� ��������, ��� ���������
                                                                              �� �� �������. ������ ������, ���������� � ���������� ������ �������,
      ['{00020400-0000-0000-C000-000000000046}']
                                                                              ������������ ����� ��������� � ������������� out. ��������� safecall
      function GetTypeInfoCount(out Count: Integer): HResult; stdcall;        ������������� ���������� Delphi ������������� ������� ������ ���� ��-
      function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HRe-      ����� ������ ���� �������� � ���� ����������� try-except. ������ ��-
      sult; stdcall;                                                          �������� � Delphi ���������� �� ���������, ������� ��� ���������
                                                                              ��� ���������� ���������� ������������� ������ ��� ����������� ��-
      function GetIDsOfNames(const IID: TGUID; Names: Pointer; Name-
                                                                              ������ ��� ������� ������. ��������:
      Count, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
      function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Inte-          //��� ������ ��������� ����� ���-��, ������������ �� IDspatch
      ger; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer):       function MyMethod(out param: <��� ����������>): HResult; stdcall;
      HResult; stdcall;
                                                                                  //��� ����� ���-��, ������������ �� IDspatch, ���������� � Delphi
    end;                                                                          function MyMethod: <��� ����������>;
    ��� ��������� � ������ ���������� ���������� � ������ ��������                 � �����������, �������������� IDispatch, ����� �������� �� ����-
���������� ����������� ��������� ��������:                                    �� ������, �� � ��������. �������� ������ �� ����������, �� ��� �����
    1) ��� ���������� ��������� ���������� � ����� GetIDsOfNames,             � ������ ������ � ��������� ������������ �������, �������� �������
       ������� ���������� �������� �������������, ���������� ����-            ������ ���������� � ��������� Get_ (��� ����������) � Set_ (��� ����-
       ����������� ����� ������ �������;                                      ��) ��������������. �������� ����� ���� �������� �� ������ �� ������ �
    2) �������� ������������� ���������� � Invoke ��� ��������� ����-         ������ ������������, �� � ������ �� ������ ��� ������ �� ������. ���-
       �� �� ���������� ����� ����������.                                     ������ Get_ � Set_, ��������������� ��������, �������� ����������
                                                                              ��� ��� �������, ����� � �����-���� ����� ���������������� ����������
                                                                              ������� �� ��������������.
                                   45                                                                             46