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

UptoLike

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

ɉɪɢɦɟɱɚɧɢɟ 1.5. ɋɢɫɬɟɦɧɵɣ ɪɟɟɫɬɪ ɹɜɥɹɟɬɫɹ ɨɱɟɧɶ ɜɚɠɧɨɣ ɫɭɳɧɨ-
ɫɬɶɸ ɜ ɨɩɟɪɚɰɢɨɧɧɨɣ ɫɢɫɬɟɦɟ. ɍɞɚɥɟɧɢɟ ɢɥɢ ɢɡɦɟɧɟɧɢɟ ɜ ɧɺɦ ɤɚɤɢɯ-ɥɢɛɨ
ɞɚɧɧɵɯ ɦɨɠɟɬ ɩɪɢɜɟɫɬɢ ɤ ɧɟɜɨɡɦɨɠɧɨɫɬɢ ɪɚɛɨɬɵ ɧɟɤɨɬɨɪɵɯ ɩɪɢɥɨ-
ɠɟɧɢɣ, ɚ ɬɨ ɢ ɜɫɟɣ ɨɩɟɪɚɰɢɨɧɧɨɣ ɫɢɫɬɟɦɵ. ȼɫɟ ɢɡɦɟɧɟɧɢɹ ɜ ɪɟɟɫɬɪɟ ɡɚ-
ɩɢɫɵɜɚɸɬɫɹ ɫɪɚɡɭ ɧɚ ɞɢɫɤ, ɨɬɤɚɬɨɜ ɜ ɫɢɫɬɟɦɟ ɧɟɬ. ɍɞɚɥɟɧɢɟ ɢɥɢ ɢɡɦɟ-
ɧɟɧɢɟ ɞɚɧɧɵɯ ɜ ɫɢɫɬɟɦɧɨɦ ɪɟɟɫɬɪɟ ɛɟɡ ɱɟɬɤɨɝɨ ɩɨɧɢɦɚɧɢɹ ɫɭɬɢ ɩɪɨɢɫ-
ɯɨɞɹɳɟɝɨ ɤɪɚɣɧɟ ɨɩɚɫɧɨ. ɉɨɩɵɬɤɢ ɮɟɧɨɦɟɧɨɥɨɝɢɱɟɫɤɨɝɨ ɢɫɫɥɟɞɨɜɚɧɢɹ
ɱɬɨ ɛɭɞɟɬ, ɟɫɥɢ ɭɞɚɥɢɬɶ ɜɨɬ ɷɬɨ…” ɦɨɝɭɬ ɩɥɨɯɨ ɤɨɧɱɢɬɶɫɹ.
Ⱦɚɧɧɵɟ ɨɛ ɨɛɴɟɤɬɚɯ COM ɯɪɚɧɹɬɫɹ ɜ ɩɨɞɪɚɡɞɟɥɟ CLSID ɪɚɡɞɟɥɚ
HKEY_CLASSES_ROOT. ȼ ɷɬɨɦ ɪɚɡɞɟɥɟ ɩɟɪɟɱɢɫɥɟɧɵ CLSID ɜɫɟɯ ɤɨɦ-
ɩɨɧɟɧɬɨɜ, ɭɫɬɚɧɨɜɥɟɧɧɵɯ ɜ ɫɢɫɬɟɦɟ. Ʉɚɠɞɵɣ CLSID ɫɨɞɟɪɠɢɬ ɩɚɪɚɦɟɬɪ
ɩɨ ɭɦɨɥɱɚɧɢɸ, ɧɚɡɵɜɚɟɦɵɣ «ɞɪɭɠɟɫɬɜɟɧɧɵɦ» ɢɦɟɧɟɦ ɤɨɦɩɨɧɟɧɬɚ. ȼ
ɪɚɡɞɟɥɟ ɨɩɢɫɚɧɢɹ ɤɨɦɩɨɧɟɧɬɚ ɟɫɬɶ ɩɨɞɪɚɡɞɟɥ LocalServer32 (ɞɥɹ ɜɧɟɲɧɢɯ
COM-ɫɟɪɜɟɪɨɜ) ɢɥɢ InprocServer32 (ɞɥɹ ɜɧɭɬɪɟɧɧɢɯ COM-ɫɟɪɜɟɪɨɜ), ɫɨ-
ɞɟɪɠɚɳɢɯ ɢɦɹ ɩɪɢɥɨɠɟɧɢɹ ɢɥɢ DLL, ɜ ɤɨɬɨɪɵɯ ɧɚɯɨɞɢɬɫɹ ɤɨɦɩɨɧɟɧɬ.
ɂɦɹ ɮɚɣɥɚ ɢ CLSID – ɷɬɨ ɧɚɢɛɨɥɟɟ ɜɚɠɧɵɟ ɞɚɧɧɵɟ ɞɥɹ ɧɨɪɦɚɥɶɧɨɝɨ
ɮɭɧɤɰɢɨɧɢɪɨɜɚɧɢɹ, ɧɨ ɞɥɹ ɧɟɤɨɬɨɪɵɯ, ɛɨɥɟɟ ɫɥɨɠɧɵɯ ɤɨɦɩɨɧɟɧɬɨɜ
COM, ɯɪɚɧɢɬɫɹ ɢ ɞɪɭɝɚɹ ɢɧɮɨɪɦɚɰɢɹ. ɇɚɩɪɢɦɟɪ, ɷɬɨ ɧɨɦɟɪ ɛɢɛɥɢɨɬɟɤɢ
ɬɢɩɨɜ, ɩɨɞɞɟɪɠɢɜɚɟɦɨɣ ɞɚɧɧɵɦ COM-ɫɟɪɜɟɪɨɦ (TypeLib), ɧɨɦɟɪ ɜɟɪɫɢɢ
COM-ɫɟɪɜɟɪɚ (Version), ɩɪɨɝɪɚɦɦɧɨɟ ɢɦɹ (ProgID) ɢɬ. ɩ.
ɑɬɨɛɵ ɡɚɪɟɝɢɫɬɪɢɪɨɜɚɬɶ ɜɫɬɪɨɟɧɧɵɣ COM-ɫɟɪɜɟɪ ɜ ɫɢɫɬɟɦɧɨɦ ɪɟɟ-
ɫɬɪɟ, ɧɟɨɛɯɨɞɢɦɨ ɜɵɡɜɚɬɶ ɮɭɧɤɰɢɸ DllRegisterServer, ɧɚɯɨɞɹɳɭɸɫɹ ɜɧɭɬ-
ɪɢ DLL-ɦɨɞɭɥɹ COM-ɫɟɪɜɟɪɚ. ɗɬɨ ɦɨɠɧɨ ɫɞɟɥɚɬɶ ɜ ɩɪɢɥɨɠɟɧɢɢ, ɩɪɟɞɜɚ-
ɪɢɬɟɥɶɧɨ ɡɚɝɪɭɡɢɜ DLL, ɢɥɢ ɫ ɩɨɦɨɳɶɸ ɫɬɚɧɞɚɪɬɧɨɣ ɭɬɢɥɢɬɵ Windows
RegSvr32.exe, ɜɵɩɨɥɧɢɜ ɤɨɦɚɧɞɭ:
RegSvr32 -s <ɢɦɹ ɫɟɪɜɟɪɚ>
ɉɪɢ ɭɞɚɥɟɧɢɢ ɜɫɬɪɨɟɧɧɨɝɨ ɫɟɪɜɟɪɚ ɢɡ ɫɢɫɬɟɦɵ ɧɟɨɛɯɨɞɢɦɨ ɡɚɩɭɫ-
ɬɢɬɶ ɮɭɧɤɰɢɸ DllUnregisterServer. ȼ Windows ɭɞɚɥɟɧɢɟ ɫɟɪɜɟɪɚ ɨɫɭɳɟɫɬ-
ɜɥɹɟɬɫɹ ɤɨɦɚɧɞɨɣ:
RegSvr32 -u <ɢɦɹ ɫɟɪɜɟɪɚ>
Ⱦɥɹ ɪɟɝɢɫɬɪɚɰɢɢ ɜɧɟɲɧɢɯ COM-ɫɟɪɜɟɪɨɜ ɬɪɟɛɭɟɬɫɹ ɡɚɩɭɫɬɢɬɶ
ɩɪɢɥɨɠɟɧɢɟ, ɜɤɥɸɱɢɜ ɜ ɤɨɦɚɧɞɧɭɸ ɫɬɪɨɤɭ ɡɚɩɭɫɤɚ ɤɥɸɱ /regserver, ɚ
ɞɥɹ ɭɞɚɥɟɧɢɹ ɧɭɠɧɨ ɢɫɩɨɥɶɡɨɜɚɬɶ ɤɥɸɱ /unregserver. ȼɫɬɪɨɟɧɧɵɣ COM-
ɫɟɪɜɟɪ ɪɟɝɢɫɬɪɢɪɭɟɬɫɹ ɢ ɩɪɢ ɩɟɪɜɨɦ ɡɚɩɭɫɤɟ ɩɪɢɥɨɠɟɧɢɹ ɛɟɡ ɜɫɹɤɢɯ
ɞɨɩɨɥɧɢɬɟɥɶɧɵɯ ɤɥɸɱɟɣ ɜ ɤɨɦɚɧɞɧɨɣ ɫɬɪɨɤɟ, ɧɨ ɩɨɫɥɟ ɷɬɨɝɨ ɫɟɪɜɟɪ ɛɭ-
ɞɟɬ ɩɪɨɞɨɥɠɚɬɶ ɪɚɛɨɬɚɬɶ.
13
II. Ɋɚɡɪɚɛɨɬɤɚ COM-ɫɟɪɜɟɪɨɜ ɜ Delphi
2.1. Ɋɚɡɪɚɛɨɬɤɚ ɢɧɬɟɪɮɟɣɫɚ
ɉɪɟɠɞɟ, ɱɟɦ ɪɟɚɥɢɡɨɜɵɜɚɬɶ COM-ɫɟɪɜɟɪ, ɧɭɠɧɨ ɪɚɡɪɚɛɨɬɚɬɶ ɢɧɬɟɪ-
ɮɟɣɫ. ɂɧɬɟɪɮɟɣɫ ɹɜɥɹɟɬɫɹ ɫɜɹɡɶɸ ɦɟɠɞɭ ɤɥɢɟɧɬɨɦ ɢ ɫɟɪɜɟɪɨɦ (ɩ. 1.4).
ȼ Delphi ɢɧɬɟɪɮɟɣɫɵ ɨɩɢɫɵɜɚɸɬɫɹ ɜ ɩɪɨɝɪɚɦɦɧɨɦ ɦɨɞɭɥɟ ɩɨ ɫɥɟ-
ɞɭɸɳɟɣ ɫɬɪɭɤɬɭɪɟ:
<ɢɦɹ ɢɧɬɟɪɮɟɣɫɚ>=interface
[<ɫɬɪɨɤɚ ɫ IID>]
{ɫɩɢɫɨɤ ɩɪɨɰɟɞɭɪ ɢ ɮɭɧɤɰɢɣ}
end;
ɂɧɬɟɪɮɟɣɫɵ, ɤɚɤ ɢ ɤɥɚɫɫɵ, ɨɛɥɚɞɚɸɬ ɫɜɨɣɫɬɜɨɦ ɧɚɫɥɟɞɨɜɚɧɢɹ:
<ɢɦɹ ɢɧɬɟɪɮɟɣɫɚ>=interface(<ɢɦɹ ɪɨɞɢɬɟɥɶɫɤɨɝɨ ɢɧɬɟɪɮɟɣɫɚ>)
[<ɫɬɪɨɤɚ ɫ IID>]
{ɫɩɢɫɨɤ ɩɪɨɰɟɞɭɪ ɢ ɮɭɧɤɰɢɣ}
end;
ɉɪɢɦɟɱɚɧɢɟ 2.1.
ȼ ɬɟɯɧɨɥɨɝɢɢ COM ɩɪɢɧɹɬɨ ɧɚɡɜɚɧɢɟ ɢɧɬɟɪɮɟɣɫɨɜ
ɧɚɱɢɧɚɬɶ ɫ ɩɪɟɮɢɤɫɚ «I» (IUnknown, IDispatch, IMyInterface ɢɬ. ɩ.).
ɉɪɢɦɟɱɚɧɢɟ 2.2.
IID ɞɨɥɠɟɧ ɛɵɬɶ ɭɧɢɤɚɥɶɧɵɦ, ɩɨɷɬɨɦɭ, ɜɫɹɤɢɣ ɪɚɡ
ɪɚɡɪɚɛɚɬɵɜɚɹ ɧɨɜɵɣ ɢɧɬɟɪɮɟɣɫ, ɢɫɩɨɥɶɡɭɣɬɟ ɝɟɧɟɪɚɬɨɪ ɭɧɢɤɚɥɶɧɵɯ
ɢɞɟɧɬɢɮɢɤɚɬɨɪɨɜ ɫɢɫɬɟɦɵ (ɜ Delphi ɷɬɨ ɤɨɦɛɢɧɚɰɢɹ ɤɥɚɜɢɲ
Ctrl+Shift+G).
ɉɪɢɦɟɱɚɧɢɟ 2.3.
ɉɪɢ ɨɩɢɫɚɧɢɢ ɦɟɬɨɞɨɜ ɢɧɬɟɪɮɟɣɫɨɜ ɧɟɨɛɯɨɞɢɦɨ
ɢɫɩɨɥɶɡɨɜɚɬɶ ɞɢɪɟɤɬɢɜɭ stdcall, ɤɨɬɨɪɚɹ ɨɩɪɟɞɟɥɹɟɬ ɩɨɪɹɞɨɤ ɩɟɪɟɞɚɱɢ
ɩɚɪɚɦɟɬɪɨɜ ɢ ɜɵɡɨɜɚ ɮɭɧɤɰɢɣ ɜ ɫɨɨɬɜɟɬɫɬɜɢɢ ɫɨ ɫɬɚɧɞɚɪɬɨɦ, ɩɪɢɧɹ-
ɬɵɦ ɜ ɨɩɟɪɚɰɢɨɧɧɨɣ ɫɢɫɬɟɦɟ Windows.
ȼɫɟ ɢɧɬɟɪɮɟɣɫɵ ɩɪɹɦɨ ɢɥɢ ɤɨɫɜɟɧɧɨ ɧɚɫɥɟɞɭɸɬɫɹ ɨɬ Iunknown, ɤɨ-
ɬɨɪɵɣ ɫɨɞɟɪɠɢɬ ɜɚɠɧɵɟ ɮɭɧɤɰɢɢ ɞɥɹ ɪɟɚɥɢɡɚɰɢɢ ɬɟɯɧɨɥɨɝɢɢ COM
(ɩ. 1.5).
Ⱦɥɹ ɤɨɪɪɟɤɬɧɨɣ ɪɚɛɨɬɵ ɩɪɢɥɨɠɟɧɢɹ ɜ ɢɧɬɟɪɮɟɣɫɟ ɫɥɟɞɭɟɬ ɨɩɢɫɵɜɚɬɶ
ɮɭɧɤɰɢɢ, ɜɨɡɜɪɚɳɚɸɳɢɟ ɞɚɧɧɵɟ ɱɟɪɟɡ ɩɚɪɚɦɟɬɪɵ, ɚ ɜ ɤɚɱɟɫɬɜɟ ɪɟɡɭɥɶɬɚ-
ɬɚɢɧɮɨɪɦɚɰɢɸ ɨ ɤɨɪɪɟɤɬɧɨɫɬɢ ɜɵɩɨɥɧɟɧɢɹ ɨɩɟɪɚɰɢɣ. ɗɬɨ ɦɨɠɟɬ ɛɵɬɶ
ɭɫɥɨɜɧɵɣ ɤɨɞ ɨɲɢɛɤɢ ɢɥɢ ɠɟ ɩɪɨɫɬɨ ɢɧɮɨɪɦɚɰɢɹ ɨɛ ɭɫɩɟɲɧɨɫɬɢ ɜɵɩɨɥ-
ɧɟɧɢɹ, ɧɚɩɪɢɦɟɪ, true – ɮɭɧɤɰɢɹ ɜɵɩɨɥɧɟɧɚ ɭɫɩɟɲɧɨ, false – ɜɨɡɧɢɤɥɢ
ɨɲɢɛɤɢ. Ɍɚɤɚɹ ɪɟɚɥɢɡɚɰɢɹ ɞɚɟɬ ɜɨɡɦɨɠɧɨɫɬɶ ɤɨɧɬɪɨɥɢɪɨɜɚɬɶ ɢ ɨɛɪɚɛɚɬɵ-
ɜɚɬɶ ɨɲɢɛɤɢ ɜ ɤɥɢɟɧɬɟ.
14
    ���������� 1.5. ��������� ������ �������� ����� ������ �����-                 II. ���������� COM-�������� � Delphi
���� � ������������ �������. �������� ��� ��������� � ��� �����-����
������ ����� �������� � ������������� ������ ��������� �����-                             2.1. ���������� ����������
�����, � �� � ���� ������������ �������. ��� ��������� � ������� ��-
���������� ����� �� ����, ������� � ������� ���. �������� ��� ����-         ������, ��� ������������� COM-������, ����� ����������� �����-
����� ������ � ��������� ������� ��� ������� ��������� ���� �����-      ����. ��������� �������� ������ ����� �������� � �������� (�. 1.4).
�������� ������ ������. ������� ������������������� ������������            � Delphi ���������� ����������� � ����������� ������ �� ���-
“��� �����, ���� ������� ��� ���…” ����� ����� ���������.               ������ ���������:
                                                                             <��� ����������>=interface
     ������ �� �������� COM �������� � ���������� CLSID �������                          [<������ � IID>]
HKEY_CLASSES_ROOT. � ���� ������� ����������� CLSID ���� ���-                            {������ �������� � �������}
��������, ������������� � �������. ������ CLSID �������� ��������            end;
�� ���������, ���������� «�������������» ������ ����������. �
������� �������� ���������� ���� ��������� LocalServer32 (��� �������       ����������, ��� � ������, �������� ��������� ������������:
COM-��������) ��� InprocServer32 (��� ���������� COM-��������), ��-          <��� ����������>=interface(<��� ������������� ����������>)
�������� ��� ���������� ��� DLL, � ������� ��������� ���������.                          [<������ � IID>]
     ��� ����� � CLSID – ��� �������� ������ ������ ��� �����������                      {������ �������� � �������}
����������������, �� ��� ���������, ����� ������� �����������                end;
COM, �������� � ������ ����������. ��������, ��� ����� ����������
�����, �������������� ������ COM-�������� (TypeLib), ����� ������           ���������� 2.1. � ���������� COM ������� �������� �����������
COM-������� (Version), ����������� ��� (ProgID) � �. �.                 �������� � �������� «I» (IUnknown, IDispatch, IMyInterface � �. �.).
     ����� ���������������� ���������� COM-������ � ��������� ���-
                                                                            ���������� 2.2. IID ������ ���� ����������, �������, ������ ���
����, ���������� ������� ������� DllRegisterServer, ����������� ����-
                                                                        ������������ ����� ���������, ����������� ��������� ����������
�� DLL-������ COM-�������. ��� ����� ������� � ����������, ������-
                                                                        ��������������� ������� (� Delphi ��� ���������� ������
�������� �������� DLL, ��� � ������� ����������� ������� Windows
                                                                        Ctrl+Shift+G).
RegSvr32.exe, �������� �������:
                                                                            ���������� 2.3. ��� �������� ������� ����������� ����������
                      RegSvr32 -s <��� �������>
                                                                        ������������ ��������� stdcall, ������� ���������� ������� ��������
     ��� �������� ����������� ������� �� ������� ���������� �����-      ���������� � ������ ������� � ������������ �� ����������, �����-
���� ������� DllUnregisterServer. � Windows �������� ������� �������-   ��� � ������������ ������� Windows.
������� ��������:
                                                                             ��� ���������� ����� ��� �������� ����������� �� Iunknown, ��-
                     RegSvr32 -u <��� �������>                          ����� �������� ������ ������� ��� ���������� ���������� COM
     ��� ����������� ������� COM-�������� ��������� ���������           (�. 1.5).
����������, ������� � ��������� ������ ������� ���� /regserver, �            ��� ���������� ������ ���������� � ���������� ������� ���������
��� �������� ����� ������������ ���� /unregserver. ���������� COM-      �������, ������������ ������ ����� ���������, � � �������� ��������-
������ �������������� � ��� ������ ������� ���������� ��� ������        �� – ���������� � ������������ ���������� ��������. ��� ����� ����
�������������� ������ � ��������� ������, �� ����� ����� ������ ��-     �������� ��� ������ ��� �� ������ ���������� �� ���������� �����-
��� ���������� ��������.                                                �����, ��������, true – ������� ��������� �������, false – ��������
                                                                        ������. ����� ���������� ���� ����������� �������������� � ��������-
                                                                        ���� ������ � �������.



                                 13                                                                      14