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

UptoLike

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

21
Fobj1: IInterface1;
protected
property Intf: IInterface1 read FObj1 implements IInterface1;
procedure DoIt2;
constructor Create;
destructor Destroy;override;
end;
implemetation
{TObject1}
procedure TObject1.DoIt1;
begin
<…………………>
end;
constructor TCombinedObject.Create;
begin
inherited;
FObj1:=TObject1.Create;
end;
destructor TCombinedObject.Destroy;
begin
FObj1:=nil;
inherited;
end;
procedure TCombinedObject.DoIt2;
begin
<…………………>
end;
ɉɭɫɬɶ ɜ ɩɪɨɝɪɚɦɦɟ, ɢɫɩɨɥɶɡɭɸɳɟɣ ɤɨɦɩɨɧɟɧɬ TCombinedObject, ɟɫɬɶ
ɩɟɪɟɦɟɧɧɚɹ I2 – ɫɫɵɥɤɚ ɧɚ ɢɧɬɟɪɮɟɣɫ IInterface2. ɑɬɨɛɵ ɩɨɥɭɱɢɬɶ ɫɫɵɥɤɭ
ɧɚ IInterface1, ɢɫɩɨɥɶɡɭɟɬɫɹ ɨɩɟɪɚɬɨɪ as:
I1:=I2 as IInterface1;
ɉɪɢɦɟɱɚɧɢɟ 2.6.
Ʉɚɤ ɛɵɥɨ ɫɤɚɡɚɧɨ ɜ ɩ. 1.5, ɞɥɹ ɩɨɥɭɱɟɧɢɹ ɫɫɵɥɤɢ ɧɚ
ɞɪɭɝɨɣ ɩɨɞɞɟɪɠɢɜɚɟɦɵɣ ɢɧɬɟɪɮɟɣɫ ɧɭɠɧɨ ɢɫɩɨɥɶɡɨɜɚɬɶ ɮɭɧɤɰɢɸ Que-
ryInterface, ɧɨ ɜ Delphi ɞɚɧɧɚɹ ɨɩɟɪɚɰɢɹ ɪɟɚɥɢɡɨɜɚɧɚ ɫ ɩɨɦɨɳɶɸ ɨɩɟɪɚɬɨ-
ɪɚ as.
Ɉɛɴɟɤɬ TObject1 ɞɚɧɧɨɝɨ ɩɪɢɦɟɪɚ ɩɪɢɧɹɬɨ ɧɚɡɵɜɚɬɶ ɚɝɪɟɝɢɪɨɜɚɧɧɵɦ
(ɨɛɴɟɞɢɧɹɟɦɵɦ), ɚ ɨɛɴɟɤɬ, ɤɨɬɨɪɵɣ ɯɪɚɧɢɬ ɫɫɵɥɤɭ ɧɚ ɚɝɪɟɝɢɪɭɟɦɵɣ ɨɛɴ-
ɟɤɬ (TCombinedObject), ɧɚɡɵɜɚɸɬ ɤɨɧɬɟɣɧɟɪɨɦ.
ɉɪɢɦɟɱɚɧɢɟ 2.7.
Ɉɛɪɚɬɢɬɟ ɜɧɢɦɚɧɢɟ, ɱɬɨ ɢɡ ɢɧɬɟɪɮɟɣɫɚ ɚɝɪɟɝɢɪɨ-
ɜɚɧɧɨɝɨ ɨɛɴɟɤɬɚ ɧɟɥɶɡɹ ɩɨɥɭɱɢɬɶ ɫɫɵɥɤɭ ɧɚ ɤɨɧɬɟɣɧɟɪ. ɂɧɵɦɢ ɫɥɨɜɚɦɢ,
ɜɵɪɚɠɟɧɢɟ I2 as Interface1 ɜ ɧɚɲɟɦ ɩɪɢɦɟɪɟ ɫɝɟɧɟɪɢɪɭɟɬ ɨɲɢɛɤɭ.
2.6. Ƚɟɧɟɪɚɬɨɪ ɤɨɦɩɨɧɟɧɬɨɜ
Ⱦɥɹ ɩɨɪɨɠɞɟɧɢɹ ɧɨɜɨɝɨ ɷɤɡɟɦɩɥɹɪɚ ɤɨɦɩɨɧɟɧɬɚ, ɩɪɢ ɡɚɩɪɨɫɟ ɩɪɢɥɨ-
ɠɟɧɢɟɦ-ɤɥɢɟɧɬɨɦ, ɢɫɩɨɥɶɡɭɟɬɫɹ ɫɬɚɧɞɚɪɬɧɵɣ ɦɟɯɚɧɢɡɦ COM, ɧɚɡɜɚɧɧɵɣ
ɝɟɧɟɪɚɬɨɪɨɦ ɤɨɦɩɨɧɟɧɬɨɜ, ɢɥɢ ɮɚɛɪɢɤɨɣ ɤɥɚɫɫɚ. Ʌɸɛɨɣ ɤɨɦɩɨɧɟɧɬ ɢɦɟ-
ɟɬ ɚɫɫɨɰɢɢɪɨɜɚɧɧɵɣ ɫ ɧɢɦ ɝɟɧɟɪɚɬɨɪ ɤɨɦɩɨɧɟɧɬɨɜ, ɤɨɬɨɪɵɣ ɩɨɞɞɟɪɠɢɜɚ-
ɟɬ ɫɬɚɧɞɚɪɬɧɵɣ ɢɧɬɟɪɮɟɣɫ IClassFactory:
IClassFactory = interface(IUnknown)
['{00000001-0000-0000-C000-000000000046}']
function CreateInstance(const unkOuter: IUnknown; const iid: TIID;
out obj): HResult; stdcall;
function LockServer(fLock: BOOL): HResult; stdcall;
end;
Ɏɭɧɤɰɢɹ ɋreateInstance ɨɬɜɟɬɫɬɜɟɧɧɚ ɡɚ ɫɨɡɞɚɧɢɟ ɷɤɡɟɦɩɥɹɪɚ ɤɨɦɩɨ-
ɧɟɧɬɚ, ɧɚ ɤɨɬɨɪɵɣ ɫɫɵɥɚɟɬɫɹ ɝɟɧɟɪɚɬɨɪ ɤɨɦɩɨɧɟɧɬɨɜ. Ʉɚɤ ɩɪɚɜɢɥɨ, ɧɟɬ
ɧɟɨɛɯɨɞɢɦɨɫɬɢ ɜɵɡɵɜɚɬɶ ɞɚɧɧɭɸ ɮɭɧɤɰɢɸ ɫɚɦɨɫɬɨɹɬɟɥɶɧɨ, ɩɨɷɬɨɦɭ
ɩɨɞɪɨɛɧɨɟ ɨɩɢɫɚɧɢɟ ɩɚɪɚɦɟɬɪɨɜ ɜ ɞɚɧɧɨɦ ɦɟɬɨɞɢɱɟɫɤɨɦ ɩɨɫɨɛɢɢ ɪɚɫ-
ɫɦɚɬɪɢɜɚɬɶɫɹ ɧɟ ɛɭɞɟɬ.
LockServer ɢɫɩɨɥɶɡɭɟɬɫɹ ɫɢɫɬɟɦɨɣ ɞɥɹ ɩɨɞɫɱɟɬɚ ɫɫɵɥɨɤ ɨɛɪɚɳɟɧɢɣ ɤ
COM-ɫɟɪɜɟɪɭ. Ʉɨɝɞɚ ɩɪɢɥɨɠɟɧɢɟ ɡɚɩɪɚɲɢɜɚɟɬ ɤɨɦɩɨɧɟɧɬ, ɜ ɞɚɧɧɭɸ
ɮɭɧɤɰɢɸ ɩɟɪɟɞɚɟɬɫɹ ɩɚɪɚɦɟɬɪ true ɢ ɫɱɟɬɱɢɤ ɭɜɟɥɢɱɢɜɚɟɬɫɹ ɧɚ ɟɞɢɧɢɰɭ.
Ʉɨɝɞɚ COM-ɫɟɪɜɟɪ ɧɟ ɧɭɠɟɧ ɩɪɢɥɨɠɟɧɢɸ, ɜ LockServer ɩɟɪɟɞɚɟɬɫɹ ɩɚɪɚ-
ɦɟɬɪ false ɢ ɫɱɟɬɱɢɤ ɧɚ ɟɞɢɧɢɰɭ ɭɦɟɧɶɲɚɟɬɫɹ. ȼ ɫɥɭɱɚɟ ɨɛɧɭɥɟɧɢɹ ɫɱɟɬ-
ɱɢɤɚ COM-ɫɟɪɜɟɪ ɚɜɬɨɦɚɬɢɱɟɫɤɢ ɜɵɝɪɭɠɚɟɬɫɹ.
ɉɪɢɦɟɱɚɧɢɟ 2.8.
Microsoft ɨɛɴɹɜɢɥɚ ɟɳɟ ɨɞɢɧ ɢɧɬɟɪɮɟɣɫ IClassFac-
tory2, ɤɨɬɨɪɵɣ ɞɨɛɚɜɥɹɟɬ ɤ IClassFactory ɩɨɞɞɟɪɠɤɭ ɥɢɰɟɧɡɢɪɨɜɚɧɢɹ ɢɥɢ
ɪɚɡɪɟɲɟɧɢɹ ɧɚ ɫɨɡɞɚɧɢɟ. Ʉɥɢɟɧɬ ɨɛɹɡɚɧ ɩɟɪɟɞɚɬɶ ɝɟɧɟɪɚɬɨɪɭ ɤɨɦɩɨɧɟɧ-
ɬɨɜ ɩɪɢ ɩɨɦɨɳɢ IClassFactory2 ɤɨɪɪɟɤɬɧɵɣ ɤɥɸɱ ɢɥɢ ɥɢɰɟɧɡɢɸ, ɩɪɟɠɞɟ
ɱɟɦ ɷɬɨɬ ɝɟɧɟɪɚɬɨɪ ɛɭɞɟɬ ɫɨɡɞɚɜɚɬɶ ɤɨɦɩɨɧɟɧɬɵ. [4]
22
Ʉɨɝɞɚ ɤɥɢɟɧɬ ɩɟɪɟɞɚɟɬ ɫɢɫɬɟɦɟ COM ɡɚɩɪɨɫ ɧɚ ɧɨɜɵɣ ɷɤɡɟɦɩɥɹɪ, ɫɧɚ-
ɱɚɥɚ ɢɳɟɬɫɹ ɢ ɡɚɝɪɭɠɚɟɬɫɹ (ɟɫɥɢ ɨɧ ɧɟ ɡɚɝɪɭɠɟɧ) COM-ɫɟɪɜɟɪ,
ɫɨɨɬɜɟɬɫɬɜɭɸɳɢɣ ɡɚɩɪɚɲɢɜɚɟɦɨɦɭ ɤɨɦɩɨɧɟɧɬɭ. Ɂɚɬɟɦ ɫɢɫɬɟɦɚ COM
ɩɨɞɤɥɸɱɚɟɬɫɹ ɤ ɮɚɛɪɢɤɟ ɤɨɦɩɨɧɟɧɬɨɜ ɱɟɪɟɡ ɢɧɬɟɪɮɟɣɫ COM, ɜɵɡɵɜɚɟɬ
ɫɨɨɬɜɟɬɫɬɜɭɸɳɭɸ ɮɭɧɤɰɢɸ CreateInstance ɢ ɩɟɪɟɞɚɟɬ ɤɥɢɟɧɬɭ
ɫɨɨɬɜɟɬɫɬɜɭɸɳɭɸ ɫɫɵɥɤɭ.
             Fobj1: IInterface1;                                                  ������ TObject1 ������� ������� ������� �������� ��������������
         protected                                                           (������������), � ������, ������� ������ ������ �� ������������ ���-
             property Intf: IInterface1 read FObj1 implements IInterface1;   ��� (TCombinedObject), �������� �����������.
                procedure DoIt2;                                                 ���������� 2.7. �������� ��������, ��� �� ���������� ��������-
                                                                             ������� ������� ������ �������� ������ �� ���������. ����� �������,
                constructor Create;                                          ��������� I2 as Interface1 � ����� ������� ����������� ������.
                destructor Destroy;override;
         end;                                                                                   2.6. ��������� �����������
    implemetation                                                                 ��� ���������� ������ ���������� ����������, ��� ������� �����-
                                                                             ������-��������, ������������ ����������� �������� COM, ���������
    {TObject1}
                                                                             ����������� �����������, ��� �������� ������. ����� ��������� ���-
    procedure TObject1.DoIt1;                                                �� ��������������� � ��� ��������� �����������, ������� ����������-
    begin                                                                    �� ����������� ��������� IClassFactory:
       <…………………>                                                                 IClassFactory = interface(IUnknown)
    end;                                                                               ['{00000001-0000-0000-C000-000000000046}']
                                                                                    function CreateInstance(const unkOuter: IUnknown; const iid: TIID;
    constructor TCombinedObject.Create;
                                                                                                            out obj): HResult; stdcall;
    begin
                                                                                    function LockServer(fLock: BOOL): HResult; stdcall;
       inherited;
                                                                                 end;
       FObj1:=TObject1.Create;
                                                                                 ������� �reateInstance ������������ �� �������� ���������� �����-
    end;
                                                                             �����, �� ������� ��������� ��������� �����������. ��� �������, ���
    destructor TCombinedObject.Destroy;                                      ������������� �������� ������ ������� ��������������, �������
    begin                                                                    ��������� �������� ���������� � ������ ������������ ������� ���-
       FObj1:=nil;                                                           ������������ �� �����.
       inherited;                                                                LockServer ������������ �������� ��� �������� ������ ��������� �
    end;                                                                     COM-�������. ����� ���������� ����������� ���������, � ������
                                                                             ������� ���������� �������� true � ������� ������������� �� �������.
    procedure TCombinedObject.DoIt2;                                         ����� COM-������ �� ����� ����������, � LockServer ���������� ����-
    begin                                                                    ���� false � ������� �� ������� �����������. � ������ ��������� ����-
       <…………………>                                                             ���� COM-������ ������������� �����������.
    end;
                                                                                  ���������� 2.8. Microsoft �������� ��� ���� ��������� IClassFac-
     ����� � ���������, ������������ ��������� TCombinedObject, ����         tory2, ������� ��������� � IClassFactory ��������� �������������� ���
���������� I2 – ������ �� ��������� IInterface2. ����� �������� ������       ���������� �� ��������. ������ ������ �������� ���������� ��������-
�� IInterface1, ������������ �������� as:                                    ��� ��� ������ IClassFactory2 ���������� ���� ��� ��������, ������
         I1:=I2 as IInterface1;                                              ��� ���� ��������� ����� ��������� ����������. [4]
     ���������� 2.6. ��� ���� ������� � �. 1.5, ��� ��������� ������ ��           ����� ������ �������� ������� COM ������ �� ����� ���������, ���-
������ �������������� ��������� ����� ������������ ������� Que-              ���� ������ � ����������� (���� �� �� ��������) COM-������,
ryInterface, �� � Delphi ������ �������� ����������� � ������� �������-      ��������������� �������������� ����������. ����� ������� COM
�� as.                                                                       ������������ � ������� ����������� ����� ��������� COM, ��������
                                                                             ��������������� ������� CreateInstance � �������� �������
                                                                             ��������������� ������.
                                      21                                                                        22