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

UptoLike

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

ɞɪɭɝɢɦɢ ɩɪɨɢɡɜɨɞɢɬɟɥɹɦɢ, ɛɭɞɭɬ ɜɵɝɥɹɞɟɬɶ ɛɨɥɟɟ ɫɥɭɱɚɣɧɵɦɢ ɢ ɧɟ ɛɭ-
ɞɭɬ ɢɦɟɬɶ ɫɬɨɥɶɤɨ ɧɭɥɟɣ.
1.4. Ⱦɨɫɬɭɩ ɤ ɤɨɦɩɨɧɟɧɬɚɦ. ɂɧɬɟɪɮɟɣɫɵ
Ɏɚɤɬɢɱɟɫɤɢ ɪɟɚɥɢɡɚɰɢɹ ɤɨɦɩɨɧɟɧɬɚ ɡɚɤɪɵɬɚ ɞɥɹ ɩɪɢɥɨɠɟɧɢɹ. ɉɨɥɶ-
ɡɨɜɚɬɟɥɹ ɧɟ ɞɨɥɠɧɵ ɢɧɬɟɪɟɫɨɜɚɬɶ ɫɩɨɫɨɛɵ ɪɟɚɥɢɡɚɰɢɢ ɤɨɦɩɨɧɟɧɬɚ, ɟɦɭ
ɧɟɨɛɯɨɞɢɦɨ ɡɧɚɬɶ ɬɨɥɶɤɨ ɮɭɧɤɰɢɨɧɚɥɶɧɵɟ ɜɨɡɦɨɠɧɨɫɬɢ, ɤɨɬɨɪɵɟ ɦɨɠɟɬ
ɩɪɟɞɨɫɬɚɜɢɬɶ ɤɨɦɩɨɧɟɧɬ. Ⱦɨɫɬɭɩ ɤ ɤɨɦɩɨɧɟɧɬɚɦ ɨɫɭɳɟɫɬɜɥɹɟɬɫɹ ɱɟɪɟɡ
ɢɧɬɟɪɮɟɣɫ, ɤɨɬɨɪɵɣ ɢɝɪɚɟɬ ɪɨɥɶ ɤɨɧɬɪɚɤɬɚ (ɞɨɝɨɜɨɪɚ) ɦɟɠɞɭ ɨɛɴɟɤɬɨɦ ɢ
ɩɨɥɶɡɨɜɚɬɟɥɟɦ. ɉɨ ɫɭɳɟɫɬɜɭ ɢɧɬɟɪɮɟɣɫ ɩɪɟɞɫɬɚɜɥɹɟɬ ɫɨɛɨɣ ɫɩɢɫɨɤ ɭɤɚɡɚ-
ɬɟɥɟɣ ɧɚ ɩɪɨɰɟɞɭɪɵ ɢ ɮɭɧɤɰɢɢ, ɪɟɚɥɢɡɨɜɚɧɧɵɟ ɜ ɤɨɦɩɨɧɟɧɬɟ.
Ɍɚɤɢɦ ɨɛɪɚɡɨɦ, ɢɧɬɟɪɮɟɣɫ ɩɨɯɨɠ ɧɚ ɚɛɫɬɪɚɤɬɧɵɣ ɤɥɚɫɫ, ɜ ɤɨɬɨɪɨɦ
ɩɟɪɟɱɢɫɥɟɧɵ ɜɢɪɬɭɚɥɶɧɵɟ ɩɪɨɰɟɞɭɪɵ ɢ ɮɭɧɤɰɢɢ, ɪɟɚɥɢɡɚɰɢɹ ɤɨɬɨɪɵɯ
ɥɨɠɢɬɫɹ ɧɚ ɞɨɱɟɪɧɢɟ ɤɥɚɫɫɵ. ɂɧɵɦɢ ɫɥɨɜɚɦɢ, ɢɧɬɟɪɮɟɣɫ ɨɩɪɟɞɟɥɹɟɬ ɩɨ-
ɜɟɞɟɧɢɟ ɨɛɴɟɤɬɚ, ɧɨ ɧɟ ɩɨɞɞɟɪɠɢɜɚɟɬ ɫɪɟɞɫɬɜɚ ɪɟɚɥɢɡɚɰɢɢ ɷɬɨɝɨ ɩɨɜɟɞɟ-
ɧɢɹ.
ȿɳɟ ɨɞɧɢɦ ɜɚɠɧɵɦ ɫɜɨɣɫɬɜɨɦ COM-ɤɨɦɩɨɧɟɧɬɨɜ ɹɜɥɹɟɬɫɹ ɜɨɡɦɨɠ-
ɧɨɫɬɶ ɩɨɞɞɟɪɠɤɢ ɫɪɚɡɭ ɧɟɫɤɨɥɶɤɢɯ ɢɧɬɟɪɮɟɣɫɨɜ. ɗɬɨ ɞɚɟɬ ɜɨɡɦɨɠɧɨɫɬɶ
ɪɚɡɛɢɬɶ ɛɨɥɶɲɨɣ ɧɚɛɨɪ ɩɪɨɰɟɞɭɪ ɧɚ ɧɟɫɤɨɥɶɤɨ ɧɟɛɨɥɶɲɢɯ ɥɨɝɢɱɟɫɤɢɯ
ɝɪɭɩɩ.
ɉɪɢɦɟɱɚɧɢɟ 1.3.
Ɋɟɚɥɢɡɨɜɚɧɧɵɟ ɢ ɢɫɩɨɥɶɡɭɟɦɵɟ ɢɧɬɟɪɮɟɣɫɵ ɧɟ ɦɟ-
ɧɹɸɬɫɹ ɧɢɤɨɝɞɚ. ɉɪɢ ɦɨɞɢɮɢɤɚɰɢɢ ɤɨɦɩɨɧɟɧɬɚ ɫɭɳɟɫɬɜɭɸɳɢɣ ɢɧɬɟɪ-
ɮɟɣɫ ɧɟ ɦɟɧɹɟɬɫɹ, ɚ ɞɨɛɚɜɥɹɟɬɫɹ ɧɨɜɵɣ. ɗɬɨ ɨɛɟɫɩɟɱɢɜɚɟɬ ɤɨɧɬɟɤɫɬɧɭɸ
ɧɟɡɚɜɢɫɢɦɨɫɬɶ COM.
Ʉɚɤ ɢ ɤɨɦɩɨɧɟɧɬɵ, ɢɧɬɟɪɮɟɣɫɵ ɬɨɠɟ ɢɦɟɸɬ ɫɜɨɣ ɧɨɦɟɪ, ɤɨɬɨɪɵɣ ɧɚ-
ɡɵɜɚɸɬ IID (Interface Identifier), ɬɨ ɟɫɬɶ ɢɞɟɧɬɢɮɢɤɚɬɨɪ ɢɧɬɟɪɮɟɣɫɚ. ɗɬɨ
ɩɨɡɜɨɥɹɟɬ ɢɫɩɨɥɶɡɨɜɚɬɶ ɢɧɬɟɪɮɟɣɫɵ, ɧɟ ɨɩɚɫɚɹɫɶ ɫɨɜɩɚɞɟɧɢɹ ɢɦɟɧ.
1.5. ɂɟɪɚɪɯɢɹ ɢɧɬɟɪɮɟɣɫɨɜ. ɂɧɬɟɪɮɟɣɫ IUnknown
ȼ ɨɫɧɨɜɟ ɜɫɟɯ COM-ɢɧɬɟɪɮɟɣɫɨɜ ɥɟɠɢɬ ɢɧɬɟɪɮɟɣɫ ɫ ɢɦɟɧɟɦ
IUnknown. ɗɬɨɬ ɢɧɬɟɪɮɟɣɫ ɩɨɞɞɟɪɠɢɜɚɟɬ ɬɪɢ ɜɚɠɧɵɟ ɮɭɧɤɰɢɢ, ɤɨɬɨɪɵɟ
ɧɚɫɥɟɞɭɸɬɫɹ ɤɚɠɞɨɦɭ ɢɧɬɟɪɮɟɣɫɭ:
IUnknown=interface
[‘{00000000-0000-0000-C000-000000000046}’]
function QueryInterface(const IID: TGUID; out obj): HResult;
stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
9
ɉɪɢ ɞɢɧɚɦɢɱɟɫɤɨɣ ɡɚɝɪɭɡɤɟ ɤɨɦɩɨɧɟɧɬɚ ɫɢɫɬɟɦɚ ɧɟ ɡɧɚɟɬ, ɤɚɤɢɟ ɩɨɞ-
ɞɟɪɠɢɜɚɸɬɫɹ ɢɧɬɟɪɮɟɣɫɵ, ɧɨ ɡɧɚɟɬ, ɱɬɨ ɩɪɹɦɨ ɢɥɢ ɤɨɫɜɟɧɧɨ ɩɨɞɞɟɪɠɢɜɚ-
ɟɬɫɹ ɢɧɬɟɪɮɟɣɫ IUnknown, ɜ ɤɨɬɨɪɨɦ ɪɟɚɥɢɡɨɜɚɧɚ ɮɭɧɤɰɢɹ QueryInterface
ɫɨ ɫɥɟɞɭɸɳɢɦɢ ɩɚɪɚɦɟɬɪɚɦɢ:
IID – ɢɞɟɧɬɢɮɢɤɚɬɨɪ ɡɚɩɪɚɲɢɜɚɟɦɨɝɨ ɢɧɬɟɪɮɟɣɫɚ;
Obj – ɩɪɟɞɧɚɡɧɚɱɟɧ ɞɥɹ ɯɪɚɧɟɧɢɹ ɜɨɡɜɪɚɳɚɟɦɨɝɨ ɢɧɬɟɪɮɟɣɫɧɨɝɨ ɭɤɚ-
ɡɚɬɟɥɹ.
Ɏɭɧɤɰɢɹ QueryInterface ɞɨɥɠɧɚ ɛɵɬɶ ɪɟɚɥɢɡɨɜɚɧɚ ɜ ɤɨɦɩɨɧɟɧɬɟ ɬɚ-
ɤɢɦ ɨɛɪɚɡɨɦ, ɱɬɨɛɵ ɦɨɠɧɨ ɛɵɥɨ ɩɨɥɭɱɢɬɶ ɥɸɛɨɣ ɩɨɞɞɟɪɠɢɜɚɟɦɵɣ ɢɧ-
ɬɟɪɮɟɣɫ.
ȿɫɥɢ ɡɚɩɪɚɲɢɜɚɟɦɵɣ ɢɧɬɟɪɮɟɣɫ ɜ ɤɨɦɩɨɧɟɧɬɟ ɪɟɚɥɢɡɨɜɚɧ,
QueryInterface ɜɨɡɜɪɚɳɚɟɬ ɭɤɚɡɚɬɟɥɶ ɧɚ ɢɧɬɟɪɮɟɣɫ ɜ ɩɚɪɚɦɟɬɪɟ obj ɢ ɡɧɚ-
ɱɟɧɢɟ S_OK, ɢɧɚɱɟ – E_NOINTERFACE.
ɉɨɫɥɟ ɪɚɛɨɬɵ ɫ ɤɨɦɩɨɧɟɧɬɨɦ ɧɟɨɛɯɨɞɢɦɨ ɟɝɨ ɜɵɝɪɭɡɢɬɶ ɢɡ ɩɚɦɹɬɢ.
ɋɥɨɠɧɨɫɬɢ ɦɨɝɭɬ ɜɨɡɧɢɤɧɭɬɶ, ɤɨɝɞɚ ɧɚ ɤɨɦɩɨɧɟɧɬ, ɜɟɪɧɟɟ, ɧɚ ɟɝɨ ɢɧɬɟɪ-
ɮɟɣɫɵ, ɢɦɟɟɬɫɹ ɧɟɫɤɨɥɶɤɨ ɫɫɵɥɨɤ. ȼ ɛɨɥɶɲɢɯ ɩɪɨɟɤɬɚɯ ɭɫɥɟɞɢɬɶ ɡɚ ɷɬɢɦ
ɩɪɚɤɬɢɱɟɫɤɢ ɧɟɜɨɡɦɨɠɧɨ.
ɑɬɨɛɵ ɢɡɛɟɠɚɬɶ ɬɚɤɨɣ ɫɢɬɭɚɰɢɢ ɢɫɩɨɥɶɡɭɟɬɫɹ ɫɱɟɬɱɢɤ ɫɫɵɥɨɤ. Ʉɨɝɞɚ
ɤɥɢɟɧɬ ɩɨɥɭɱɚɟɬ ɧɟɤɨɬɨɪɵɣ ɢɧɬɟɪɮɟɣɫ, ɡɧɚɱɟɧɢɟ ɷɬɨɝɨ ɫɱɟɬɱɢɤɚ ɭɜɟɥɢɱɢ-
ɜɚɟɬɫɹ ɧɚ ɟɞɢɧɢɰɭ. Ʉɨɝɞɚ ɤɥɢɟɧɬ ɡɚɤɚɧɱɢɜɚɟɬ ɪɚɛɨɬɭ ɫ ɢɧɬɟɪɮɟɣɫɨɦ, ɡɧɚ-
ɱɟɧɢɟ ɧɚ ɟɞɢɧɢɰɭ ɭɦɟɧɶɲɚɟɬɫɹ. Ʉɨɝɞɚ ɨɧɨ ɞɨɯɨɞɢɬ ɞɨ ɧɭɥɹ, ɤɨɦɩɨɧɟɧɬ
ɭɞɚɥɹɟɬ ɫɟɛɹ ɢɡ ɩɚɦɹɬɢ. Ʉɥɢɟɧɬ ɬɚɤɠɟ ɭɜɟɥɢɱɢɜɚɟɬ ɫɱɟɬɱɢɤ ɫɫɵɥɨɤ, ɤɨɝɞɚ
ɫɨɡɞɚɟɬ ɧɨɜɭɸ ɫɫɵɥɤɭ ɧɚ ɭɠɟ ɢɦɟɸɳɢɣɫɹ ɭ ɧɟɝɨ ɢɧɬɟɪɮɟɣɫ. Ⱦɥɹ ɩɪɨɜɟ-
ɞɟɧɢɹ ɷɬɢɯ ɨɩɟɪɚɰɢɣ ɩɪɟɞɧɚɡɧɚɱɟɧɵ ɮɭɧɤɰɢɢ _AddRef ɢ _Release.
_AddRef – ɭɜɟɥɢɱɢɜɚɟɬ ɫɱɟɬɱɢɤ ɫɫɵɥɨɤ ɧɚ ɟɞɢɧɢɰɭ ɢ ɜɨɡɜɪɚɳɚɟɬ ɤɨ-
ɥɢɱɟɫɬɜɨ ɫɫɵɥɨɤ.
_Release – ɭɦɟɧɶɲɚɟɬ ɫɱɟɬɱɢɤ ɫɫɵɥɨɤ ɧɚ ɟɞɢɧɢɰɭ ɢ ɜɨɡɜɪɚɳɚɟɬ ɤɨ-
ɥɢɱɟɫɬɜɨ ɫɫɵɥɨɤ. ȿɫɥɢ ɫɱɟɬɱɢɤ ɪɚɜɟɧ ɧɭɥɸ, ɭɧɢɱɬɨɠɚɟɬ ɨɛɴɟɤɬ.
Ⱦɥɹ ɤɨɪɪɟɤɬɧɨɣ ɪɚɛɨɬɵ ɩɪɢɥɨɠɟɧɢɹ ɢ ɤɨɦɩɨɧɟɧɬɨɜ ɧɟɨɛɯɨɞɢɦɨ
ɫɬɪɨɝɨ ɫɨɛɥɸɞɚɬɶ ɬɪɢ ɩɪɚɜɢɥɚ, ɩɪɢɧɹɬɵɯ ɩɪɢ ɪɚɛɨɬɟ ɫ COM:
1. Ɏɭɧɤɰɢɢ, ɜɨɡɜɪɚɳɚɸɳɢɟ ɢɧɬɟɪɮɟɣɫɵ, ɩɟɪɟɞ ɜɨɡɜɪɚɬɨɦ ɜɫɟɝɞɚ
ɞɨɥɠɧɵ ɜɵɡɜɚɬɶ _AddRef ɞɥɹ ɫɨɨɬɜɟɬɫɬɜɭɸɳɟɝɨ ɭɤɚɡɚɬɟɥɹ.
ɗɬɨ ɬɚɤɠɟ ɨɬɧɨɫɢɬɫɹ ɢ ɤ QueryInterface.
2. ɉɨɫɥɟ ɡɚɜɟɪɲɟɧɢɹ ɪɚɛɨɬɵ ɫ ɢɧɬɟɪɮɟɣɫɨɦ ɫɥɟɞɭɟɬ ɜɵɡɜɚɬɶ ɞɥɹ
ɧɟɝɨ _Release.
3. ȼɫɟɝɞɚ ɫɥɟɞɭɟɬ ɜɵɡɵɜɚɬɶ _AddRef, ɤɨɝɞɚ ɫɨɡɞɚɟɬɫɹ ɧɨɜɚɹ ɫɫɵɥɤɚ
ɧɚ ɞɚɧɧɵɣ ɢɧɬɟɪɮɟɣɫ.
ɉɪɢɜɟɞɟɦ ɩɪɢɦɟɪ ɪɟɚɥɢɡɚɰɢɢ QueryInterface, _AddRef, _Release ɜɧɟ-
ɤɨɟɦ Ʉɨɦɩɨɧɟɧɬɟ TSomeObject:
type TSomeObject=class(TObject, ISomeInterface)
private
10
������� ���������������, ����� ��������� ����� ���������� � �� ��-              ��� ������������ �������� ���������� ������� �� �����, ����� ���-
��� ����� ������� �����.                                                   ����������� ����������, �� �����, ��� ����� ��� �������� ����������-
                                                                           ���� ��������� IUnknown, � ������� ����������� ������� QueryInterface
            1.4. ������ � �����������. ����������                          �� ���������� �����������:
                                                                                IID – ������������� �������������� ����������;
     ���������� ���������� ���������� ������� ��� ����������. ����-             Obj – ������������ ��� �������� ������������� ������������� ���-
�������� �� ������ ������������ ������� ���������� ����������, ���         ������.
���������� ����� ������ �������������� �����������, ������� �����               ������� QueryInterface ������ ���� ����������� � ���������� ��-
������������ ���������. ������ � ����������� �������������� �����          ��� �������, ����� ����� ���� �������� ����� �������������� ��-
���������, ������� ������ ���� ��������� (��������) ����� �������� �       �������.
�������������. �� �������� ��������� ������������ ����� ������ �����-           ���� ������������� ��������� � ���������� ����������,
����� �� ��������� � �������, ������������� � ����������.                  QueryInterface ���������� ��������� �� ��������� � ��������� obj � ���-
     ����� �������, ��������� ����� �� ����������� �����, � �������        ����� S_OK, ����� – E_NOINTERFACE.
����������� ����������� ��������� � �������, ���������� �������                 ����� ������ � ����������� ���������� ��� ��������� �� ������.
������� �� �������� ������. ����� �������, ��������� ���������� ��-        ��������� ����� ����������, ����� �� ���������, ������, �� ��� �����-
������� �������, �� �� ������������ �������� ���������� ����� ������-      �����, ������� ��������� ������. � ������� �������� �������� �� ����
���.                                                                       ����������� ����������.
    ��� ����� ������ ��������� COM-����������� �������� ������-                 ����� �������� ����� �������� ������������ ������� ������. �����
����� ��������� ����� ���������� �����������. ��� ���� �����������         ������ �������� ��������� ���������, �������� ����� �������� �������-
������� ������� ����� �������� �� ��������� ��������� ����������           ������ �� �������. ����� ������ ����������� ������ � �����������, ���-
�����.                                                                     ����� �� ������� �����������. ����� ��� ������� �� ����, ���������
    ���������� 1.3. ������������� � ������������ ���������� �� ��-         ������� ���� �� ������. ������ ����� ����������� ������� ������, �����
������ �������. ��� ����������� ���������� ������������ �����-             ������� ����� ������ �� ��� ��������� � ���� ���������. ��� �����-
���� �� ��������, � ����������� �����. ��� ������������ �����������        ����� ���� �������� ������������� ������� _AddRef � _Release.
������������� COM.                                                              _AddRef – ����������� ������� ������ �� ������� � ���������� ��-
    ��� � ����������, ���������� ���� ����� ���� �����, ������� ��-        �������� ������.
������ IID (Interface Identifier), �� ���� ������������� ����������. ���        _Release – ��������� ������� ������ �� ������� � ���������� ��-
��������� ������������ ����������, �� �������� ���������� ����.            �������� ������. ���� ������� ����� ����, ���������� ������.
                                                                                ��� ���������� ������ ���������� � ����������� ����������
      1.5. �������� �����������. ��������� IUnknown                        ������ ��������� ��� �������, �������� ��� ������ � COM:
                                                                               1. �������, ������������ ����������, ����� ��������� ������
    � ������ ���� COM-����������� ����� ��������� � ������                        ������ ������� _AddRef ��� ���������������� ���������.
IUnknown. ���� ��������� ������������ ��� ������ �������, �������                 ��� ����� ��������� � � QueryInterface.
����������� ������� ����������:                                                2. ����� ���������� ������ � ����������� ������� ������� ���
    IUnknown=interface                                                            ���� _Release.
          [‘{00000000-0000-0000-C000-000000000046}’]                           3. ������ ������� �������� _AddRef, ����� ��������� ����� ������
         function QueryInterface(const IID: TGUID; out obj): HResult;             �� ������ ���������.
         stdcall;                                                              �������� ������ ���������� QueryInterface, _AddRef, _Release � ��-
         function _AddRef: Integer; stdcall;                               ���� ���������� TSomeObject:
         function _Release: Integer; stdcall;
    end;                                                                       type TSomeObject=class(TObject, ISomeInterface)
                                                                                    private

                                    9                                                                        10