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

UptoLike

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

ɇɚ ɩɟɪɜɵɣ ɜɡɝɥɹɞ, ɦɨɠɟɬ ɜɨɡɧɢɤɧɭɬɶ ɜɩɟɱɚɬɥɟɧɢɟ, ɱɬɨ ɫɭɳɟɫɬɜɭɟɬ
ɢɡɥɢɲɧɹɹ ɞɭɚɥɶɧɨɫɬɶ ɧɚ ɧɚɥɢɱɢɟ ɤɥɚɫɫɚ ɤɨɦɩɨɧɟɧɬɚ ɢ ɫɨɨɬɜɟɬɫɬɜɭɸɳɟɣ
ɟɦɭ ɮɚɛɪɢɤɢ ɤɥɚɫɫɚ, ɬɚɤ ɤɚɤ ɨɞɧɚ ɮɚɛɪɢɤɚ ɤɥɚɫɫɨɜ ɦɨɠɟɬ ɜɡɹɬɶ ɧɚ ɫɟɛɹ
ɜɫɟ ɡɚɛɨɬɵ ɨ ɫɨɡɞɚɧɢɢ ɦɧɨɠɟɫɬɜɚ ɤɨɦɩɨɧɟɧɬɨɜ. ɇɨ ɧɚ ɫɚɦɨɦ ɞɟɥɟ ɢɦɟɟɬɫɹ
ɬɨɥɶɤɨ ɨɞɢɧ ɷɤɡɟɦɩɥɹɪ ɝɟɧɟɪɚɬɨɪɚ ɤɨɦɩɨɧɟɧɬɨɜ (ComServer), ɤɨɬɨɪɵɣ
ɧɚɯɨɞɢɬɫɹ ɜ ɩɨɥɟ ɡɪɟɧɢɹ COM ɢ ɫɨɞɟɪɠɢɬ ɫɩɢɫɨɤ ɜɫɟɯ ɜɧɭɬɪɟɧɧɢɯ ɨɛɴɟɤ-
ɬɨɜ ɮɚɛɪɢɤ ɤɥɚɫɫɨɜ.
Ƚɟɧɟɪɚɬɨɪ ɤɨɦɩɨɧɟɧɬɨɜ ɢɡɨɥɢɪɭɟɬ ɦɟɯɚɧɢɡɦ ɪɟɚɥɢɡɚɰɢɢ COM ɨɬ ɫɚ-
ɦɨɝɨ ɩɪɨɰɟɫɫɚ ɮɨɪɦɢɪɨɜɚɧɢɹ ɨɛɴɟɤɬɚ. ȿɫɥɢ ɛɵ ɬɚɤɨɝɨ ɝɟɧɟɪɚɬɨɪɚ ɧɟ ɛɵ-
ɥɨ, ɬɨ ɩɪɢɲɥɨɫɶ ɛɵ ɜɵɩɨɥɧɹɬɶ ɧɟɩɨɫɪɟɞɫɬɜɟɧɧɵɣ ɜɵɡɨɜ ɤɨɧɫɬɪɭɤɬɨɪɚ
ɤɥɚɫɫɚ, ɱɬɨɛɵ ɫɨɡɞɚɬɶ ɨɛɴɟɤɬ. Ɉɫɧɨɜɧɚɹ ɢɞɟɹ ɬɟɯɧɨɥɨɝɢɢ ɫɨɫɬɨɢɬ ɜ ɬɨɦ,
ɱɬɨɛɵ ɧɟ ɧɚɤɥɚɞɵɜɚɬɶ ɨɝɪɚɧɢɱɟɧɢɣ ɧɚ ɬɨ, ɤɚɤ ɪɟɚɥɢɡɨɜɚɧ ɨɛɴɟɤɬ, ɚɜɵ-
ɩɨɥɧɹɟɦɨɟ ɤɨɧɫɬɪɭɤɬɨɪɨɦ ɫɨɡɞɚɧɢɟ ɟɫɬɶ ɧɟ ɱɬɨ ɢɧɨɟ, ɤɚɤ ɨɞɢɧ ɢɡ ɤɨɦɩɨ-
ɧɟɧɬɨɜ ɩɪɨɰɟɫɫɚ ɪɟɚɥɢɡɚɰɢɢ.
ɉɪɢɦɟɱɚɧɢɟ 2.9.
ɋɥɟɞɭɟɬ ɡɚɦɟɬɢɬɶ, ɱɬɨ ɬɟɯɧɨɥɨɝɢɹ COM ɜɨɜɫɟ ɧɟ
ɬɪɟɛɭɟɬ, ɱɬɨɛɵ ɤɨɦɩɨɧɟɧɬɵ ɛɵɥɢ ɪɟɚɥɢɡɨɜɚɧɵ ɫ ɢɫɩɨɥɶɡɨɜɚɧɢɟɦ ɈɈɉ,
ɩɪɨɫɬɨ ɬɚɤɨɣ ɩɨɞɯɨɞ ɹɜɥɹɟɬɫɹ ɧɚɢɛɨɥɟɟ ɭɞɨɛɧɵɦ.
ɉɨɦɢɦɨ ɮɭɧɤɰɢɣ ɩɨɪɨɠɞɟɧɢɹ ɤɨɦɩɨɧɟɧɬɨɜ, ɮɚɛɪɢɤɚ ɤɥɚɫɫɨɜ ɯɪɚɧɢɬ
ɞɚɧɧɵɟ ɨ ɦɟɬɨɞɟ ɫɨɡɞɚɧɢɹ ɷɤɡɟɦɩɥɹɪɚ ɤɨɦɩɨɧɟɧɬɚ, ɬɢɩ ɦɨɞɟɥɢ ɩɨɬɨɤɨɜ
ɡɚɞɚɱ ɢ ɞɪɭɝɭɸ ɧɟɨɛɯɨɞɢɦɭɸ ɢɧɮɨɪɦɚɰɢɸ, ɤɨɬɨɪɚɹ ɩɟɪɟɞɚɟɬɫɹ ɜ ɤɨɧɫɬ-
ɪɭɤɬɨɪ. ɇɢɠɟ ɩɪɢɜɟɞɟɧ ɤɨɧɫɬɪɭɤɬɨɪ ɤɥɚɫɫɚ TClassFactory, ɢɫɩɨɥɶɡɭɟɦɵɣ
ɞɥɹ ɪɟɚɥɢɡɚɰɢɢ ɩɪɨɫɬɵɯ ɤɨɦɩɨɧɟɧɬɨɜ:
TClassFactory.Create(ComServer {ɫɬɚɧɞɚɪɬɧɨɟ ɢɦɹ ɮɚɛɪɢɤɢ ɤɥɚɫɫɨɜ
ɜ Delphi}, <ɢɦɹ ɤɥɚɫɫɚ>, <CLSID ɤɥɚɫɫɚ>, <ɦɟɬɨɞ ɫɨɡɞɚɧɢɹ ɷɤɡɟɦɩ-
ɥɹɪɚ ɤɨɦɩɨɧɟɧɬɚ>, <ɬɢɩ ɦɨɞɟɥɢ ɩɨɬɨɤɨɜ ɡɚɞɚɱ>);
Ɇɟɬɨɞ ɫɨɡɞɚɧɢɹ ɷɤɡɟɦɩɥɹɪɚ ɤɨɦɩɨɧɟɧɬɚ ɢ ɬɢɩ ɦɨɞɟɥɢ ɩɨɬɨɤɨɜ ɡɚɞɚɱ
ɚɜɬɨɦɚɬɢɱɟɫɤɢ ɭɫɬɚɧɚɜɥɢɜɚɸɬɫɹ ɧɚ ɨɫɧɨɜɟ ɞɚɧɧɵɯ, ɜɜɟɞɟɧɧɵɯ ɜ ɦɚɫɬɟɪɟ
COM Object Wizard (ɪɢɫ. 2.2).
Ⱦɥɹ ɩɪɨɫɬɨɬɵ ɨɛɪɚɳɟɧɢɹ ɤ ɮɚɛɪɢɤɟ ɤɥɚɫɫɚ ɢɫɩɨɥɶɡɭɸɬɫɹ Co-ɤɥɚɫɫɵ,
ɤɨɬɨɪɵɟ ɩɨɞɞɟɪɠɢɜɚɸɬ ɬɪɢ ɮɭɧɤɰɢɢ:
<ɂɦɹ Co-ɤɥɚɫɫɚ> = class
class function Create: <ɢɧɬɟɪɮɟɣɫ ɤɨɦɩɨɧɟɧɬɚ>;
class function CreateRemote(const MachineName: string): <ɢɧɬɟɪ-
ɮɟɣɫ ɤɨɦɩɨɧɟɧɬɚ>;
end;
Create – ɩɪɢɦɟɧɹɟɬɫɹ ɞɥɹ ɩɨɥɭɱɟɧɢɹ ɧɨɜɨɝɨ ɷɤɡɟɦɩɥɹɪɚ ɤɨɦɩɨɧɟɧɬɚ.
CreateRemote – ɫɨɡɞɚɟɬ ɷɤɡɟɦɩɥɹɪ ɤɨɦɩɨɧɟɧɬɚ ɧɚ ɭɞɚɥɟɧɧɨɣ ɦɚɲɢɧɟ
(ɩɪɢɦɟɧɹɟɬɫɹ ɜ DCOM).
23
Ɉɛɵɱɧɨ, ɟɫɥɢ ɩɥɚɧɢɪɭɟɬɫɹ, ɱɬɨ ɤɨɦɩɨɧɟɧɬ ɛɭɞɟɬ ɡɚɩɪɚɲɢɜɚɬɶɫɹ ɤɥɢ-
ɟɧɬɨɦ, ɬɨ ɞɥɹ ɧɟɝɨ ɫɨɡɞɚɟɬɫɹ Co-ɤɥɚɫɫ, ɱɬɨɛɵ ɧɟ ɡɚɭɱɢɜɚɬɶ ɞɨɫɬɚɬɨɱɧɨ
ɞɥɢɧɧɵɣ ɭɧɢɤɚɥɶɧɵɣ ɧɨɦɟɪ CLSID ɤɨɦɩɨɧɟɧɬɚ.
ɉɪɢɦɟɱɚɧɢɟ 2.10.
Ɉɛɵɱɧɨ ɧɚɡɜɚɧɢɟ Co-ɤɥɚɫɫɨɜ ɧɚɱɢɧɚɟɬɫɹ ɫ ɩɪɟɮɢɤ-
ɫɚ «Co» ɢ ɩɨɯɨɠɟ ɧɚ ɧɚɡɜɚɧɢɟ ɤɨɦɩɨɧɟɧɬɚ, ɤɨɬɨɪɵɣ ɨɧɢ ɩɨɪɨɠɞɚɸɬ.
2.7. ɉɪɢɦɟɪ ɪɟɚɥɢɡɚɰɢɢ ɜɫɬɪɨɟɧɧɨɝɨ COM-ɫɟɪɜɟɪɚ
ȼ ɤɚɱɟɫɬɜɟ ɩɪɢɦɟɪɚ ɪɟɚɥɢɡɚɰɢɢ ɜɫɬɪɨɟɧɧɨɝɨ COM-ɫɟɪɜɟɪɚ ɫɨɡɞɚɞɢɦ
ɤɨɦɩɨɧɟɧɬ ɩɟɪɟɜɨɞɚ ɰɟɥɨɝɨ ɱɢɫɥɚ ɜ ɞɜɨɢɱɧɵɣ, ɜɨɫɶɦɟɪɢɱɧɵɣ ɢ ɲɟɫɬɧɚ-
ɞɰɚɬɟɪɢɱɧɵɣ ɜɢɞ, ɤɨɬɨɪɵɣ ɛɭɞɟɬ ɜɵɜɨɞɢɬɶɫɹ ɜ ɜɢɞɟ ɫɬɪɨɤɢ. Ⱦɚɧɧɵɣ ɤɨɦ-
ɩɨɧɟɧɬ ɛɭɞɟɬ ɩɨɞɞɟɪɠɢɜɚɬɶ ɢɧɬɟɪɮɟɣɫ, ɩɪɢɜɟɞɟɧɧɵɣ ɜ ɩɪɢɦɟɪɟ ɩ. 2.1.
1. ȼɵɩɨɥɧɢɜ ɞɟɣɫɬɜɢɹ, ɨɩɢɫɚɧɧɵɟ ɜ ɩ. 2.2, ɫɨɯɪɚɧɢɦ ɩɪɨɟɤɬ ɩɨɞ ɢɦɟɧɟɦ
Convert.dpr.
2
. Ɂɚɬɟɦ ɜɵɛɟɪɟɦ ɷɥɟɦɟɧɬ COM Object ɜ ɞɢɚɥɨɝɨɜɨɦ ɨɤɧɟ New Items
(ɩ. 2.3). ȼ ɦɚɫɬɟɪɟ COM Objeɫt Wizard ɨɬɤɥɸɱɢɦ ɨɩɰɢɢ
Include TypeLibrary ɢ Mark Interfaced Oleautomation. Ɂɚɩɨɥɧɢɦ ɫɨɨɬɜɟɬ-
ɫɬɜɭɸɳɢɟ ɩɨɥɹ: ɜ Class Name ɜɜɟɞɟɦ ObjConvert, ɚɜ Implemented inter-
faces – IConvert. ɇɚɠɚɜ ɧɚ ɤɧɨɩɤɭ OK, ɩɨɥɭɱɢɦ ɦɨɞɭɥɶ ɫɥɟɞɭɸɳɟɝɨ ɫɨ-
ɞɟɪɠɚɧɢɹ:
unit Unit1;
interface
uses
Windows, ActiveX, ComObj;
type
TObjConvert = class(TComObject, IConvert)
protected
{Declare IConvert methods here}
end;
const
Class_ObjConvert: TGUID = '{B65CC116-4C5F-11D5-8708-
854E82B6237}';
implementation
uses ComServ;
initialization
24
     �� ������ ������, ����� ���������� �����������, ��� ����������          ������, ���� �����������, ��� ��������� ����� ������������� ���-
�������� ���������� �� ������� ������ ���������� � ���������������       �����, �� ��� ���� ��������� Co-�����, ����� �� ��������� ����������
��� ������� ������, ��� ��� ���� ������� ������� ����� ����� �� ����     ������� ���������� ����� CLSID ����������.
��� ������ � �������� ��������� �����������. �� �� ����� ���� �������
������ ���� ��������� ���������� ����������� (ComServer), �������             ���������� 2.10. ������ �������� Co-������� ���������� � ������-
��������� � ���� ������ COM � �������� ������ ���� ���������� �����-     �� «Co» � ������ �� �������� ����������, ������� ��� ���������.
��� ������ �������.
     ��������� ����������� ��������� �������� ���������� COM �� ��-            2.7. ������ ���������� ����������� COM-�������
���� �������� ������������ �������. ���� �� ������ ���������� �� ��-
��, �� �������� �� ��������� ���������������� ����� ������������             � �������� ������� ���������� ����������� COM-������� ��������
������, ����� ������� ������. �������� ���� ���������� ������� � ���,    ��������� �������� ������ ����� � ��������, ������������ � ������-
����� �� ����������� ����������� �� ��, ��� ���������� ������, � ��-     ����������� ���, ������� ����� ���������� � ���� ������. ������ ���-
��������� ������������� �������� ���� �� ��� ����, ��� ���� �� �����-    ������ ����� ������������ ���������, ����������� � ������� �. 2.1.
������ �������� ����������.
                                                                         1. �������� ��������, ��������� � �. 2.2, �������� ������ ��� ������
    ���������� 2.9. ������� ��������, ��� ���������� COM ����� ��           Convert.dpr.
�������, ����� ���������� ���� ����������� � �������������� ���,         2. ����� ������� ������� COM Object � ���������� ���� New Items
������ ����� ������ �������� �������� �������.                              (�. 2.3). � ������� COM Obje�t Wizard �������� �����
    ������ ������� ���������� �����������, ������� ������� ������           Include TypeLibrary � Mark Interfaced Oleautomation. �������� �������-
                                                                            �������� ����: � Class Name ������ ObjConvert, � � Implemented inter-
������ � ������ �������� ���������� ����������, ��� ������ �������
                                                                            faces – IConvert. ����� �� ������ OK, ������� ������ ���������� ��-
����� � ������ ����������� ����������, ������� ���������� � �����-
������. ���� �������� ����������� ������ TClassFactory, ������������        ��������:
��� ���������� ������� �����������:                                          unit Unit1;
    TClassFactory.Create(ComServer {����������� ��� ������� �������
                                                                             interface
    � Delphi}, <��� ������>, , <����� �������� ������-
    ���� ����������>, <��� ������ ������� �����>);                           uses
                                                                                    Windows, ActiveX, ComObj;
    ����� �������� ���������� ���������� � ��� ������ ������� �����
������������� ��������������� �� ������ ������, ��������� � �������          type
COM Object Wizard (���. 2.2).                                                       TObjConvert = class(TComObject, IConvert)
    ��� �������� ��������� � ������� ������ ������������ Co-������,                 protected
������� ������������ ��� �������:                                                        {Declare IConvert methods here}
    <��� Co-������> = class                                                         end;
       class function Create: <��������� ����������>;
                                                                             const
       class function CreateRemote(const MachineName: string): <�����-        Class_ObjConvert: TGUID = '{B65CC116-4C5F-11D5-8708-
                                                   ���� ����������>;          854E82B6237}';
    end;
                                                                             implementation
    Create – ����������� ��� ��������� ������ ���������� ����������.
    CreateRemote – ������� ��������� ���������� �� ��������� ������          uses ComServ;
(����������� � DCOM).
                                                                             initialization


                                 23                                                                          24