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

UptoLike

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

11
FRefCount: integer;
<ɪɟɚɥɢɡɚɰɢɹ ɡɚɤɪɵɬɨɣ ɱɚɫɬɢ>
public
//ɨɩɢɫɚɧɢɟ ɢɧɬɟɪɮɟɣɫɚ IUnknown
function QueryInterface(const IID:TGUID; out obj):HResult;
stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
<ɨɩɢɫɚɧɢɟ ɨɬɤɪɵɬɨɣ ɱɚɫɬɢ>
end;
<…………>
function TSomeObject. QueryInterface(const IID:TGUID; out
obj):HResult;
begin
if GetInterface(IID, Obj) then
begin
Result:=S_OK;
_AddRef;
end else Result:=E_NOINTERFACE;
end;
function TSomeObject._AddRef: Integer;
begin
Inc(FRefCount);
Result:=FRefCount;
end;
function TSomeObject._Release: Integer;
begin
Dec(FRefCount);
Result:=FRefCount;
if FRefCount=0 then destroy;
end;
<…………>
ȼ ɩɪɢɦɟɪɟ ɨɩɢɫɚɧ ɨɛɴɟɤɬ TSomeObject, ɩɨɞɞɟɪɠɢɜɚɸɳɢɣ ɢɧɬɟɪɮɟɣɫ
ISomeInterface, ɢ ɩɨɤɚɡɚɧɚ ɪɟɚɥɢɡɚɰɢɹ ɮɭɧɤɰɢɣ QueryInterface, _AddRef ɢ
_Release.
1.6. ɉɨɪɬɚɬɢɜɧɨɫɬɶ ɢ ɤɨɦɦɭɧɢɤɚɛɟɥɶɧɨɫɬɶ COM.
Ɋɟɝɢɫɬɪɚɰɢɹ COM-ɫɟɪɜɟɪɨɜ. ɋɢɫɬɟɦɧɵɣ ɪɟɟɫɬɪ Windows
ȿɳɺ ɨɞɧɨ ɝɥɚɜɧɨɟ ɩɪɚɜɢɥɨ COM-ɬɟɯɧɨɥɨɝɢɢɨɬɫɭɬɫɬɜɢɟ ɤɨɧɬɟɤɫɬ-
ɧɨɣ ɡɚɜɢɫɢɦɨɫɬɢ ɤɥɢɟɧɬɚ ɢ ɫɟɪɜɟɪɚ. ɉɨɞ ɤɨɧɬɟɤɫɬɧɨɣ ɧɟɡɚɜɢɫɢɦɨɫɬɶɸ
ɩɨɞɪɚɡɭɦɟɜɚɟɬɫɹ, ɱɬɨ ɤɥɢɟɧɬ ɞɨɥɠɟɧ ɩɨɥɭɱɢɬɶ ɫɜɹɡɶ ɫ ɫɟɪɜɟɪɨɦ, ɝɞɟ ɛɵ ɨɧ
ɧɢ ɧɚɯɨɞɢɥɫɹ.
ɋɜɹɡɶ ɤɥɢɟɧɬɚ ɫ ɫɟɪɜɟɪɨɦ ɛɟɪɺɬ ɧɚ ɫɟɛɹ ɨɩɟɪɚɰɢɨɧɧɚɹ ɫɢɫɬɟɦɚ, ɤɨɬɨ-
ɪɚɹ ɫɨɞɟɪɠɢɬ ɫɢɫɬɟɦɧɭɸ ɛɚɡɭ ɞɚɧɧɵɯ, ɧɚɡɵɜɚɟɦɭɸ ɫɢɫɬɟɦɧɵɦ ɪɟɟɫɬ-
ɪɨɦ, ɝɞɟ ɩɪɨɩɢɫɵɜɚɟɬɫɹ ɧɚɡɜɚɧɢɟ COM-ɫɟɪɜɟɪɚ, ɭɧɢɤɚɥɶɧɵɣ ɧɨɦɟɪ ɤɨɦ-
ɩɨɧɟɧɬɚ CLSID ɢ ɞɪɭɝɚɹ ɢɧɮɨɪɦɚɰɢɹ.
ɉɪɢɦɟɱɚɧɢɟ 1.4.
Ɋɟɟɫɬɪ ɫɨɞɟɪɠɢɬ ɢɧɮɨɪɦɚɰɢɸ ɨɛ ɚɩɩɚɪɚɬɧɨɦ ɢ
ɩɪɨɝɪɚɦɦɧɨɦ ɨɛɟɫɩɟɱɟɧɢɢ, ɨ ɤɨɧɮɢɝɭɪɚɰɢɢ ɤɨɦɩɶɸɬɟɪɚ ɢ ɨ ɩɨɥɶɡɨɜɚɬɟ-
ɥɹɯ. Ʌɸɛɚɹ ɩɪɨɝɪɚɦɦɚ ɞɥɹ Windows ɦɨɠɟɬ ɞɨɛɚɜɥɹɬɶ ɢ ɫɱɢɬɵɜɚɬɶ ɢɧ-
ɮɨɪɦɚɰɢɸ ɢɡ ɪɟɟɫɬɪɚ.
Ɋɟɟɫɬɪ ɢɦɟɟɬ ɢɟɪɚɪɯɢɱɟɫɤɭɸ ɫɬɪɭɤɬɭɪɭ ɜ ɜɢɞɟ ɞɟɪɟɜɚ, ɝɞɟ ɭɡɥɚɦɢ ɹɜ-
ɥɹɸɬɫɹ ɪɚɡɞɟɥɵ, ɚ ɥɢɫɬɶɹɦɢɞɚɧɧɵɟ.
Ⱦɥɹ ɩɪɨɫɦɨɬɪɚ ɢ ɪɟɞɚɤɬɢɪɨɜɚɧɢɹ ɪɟɟɫɬɪɚ ɦɨɠɧɨ ɢɫɩɨɥɶɡɨɜɚɬɶ ɫɬɚɧ-
ɞɚɪɬɧɭɸ ɩɪɨɝɪɚɦɦɭ regedit.exe – ɪɟɞɚɤɬɨɪ ɪɟɟɫɬɪɚ (ɪɢɫ. 1.3).
Ɋɢɫ. 1.3. Ɋɟɞɚɤɬɨɪ ɪɟɟɫɬɪɚ
12
            FRefCount: integer;                                                1.6. ������������� � ������������������ COM.
            <���������� �������� �����>                                     ����������� COM-��������. ��������� ������ Windows
         public                                                               ��� ���� ������� ������� COM-���������� – ���������� ��������-
            //�������� ���������� IUnknown                                ��� ����������� ������� � �������. ��� ����������� ��������������
            function QueryInterface(const IID:TGUID; out obj):HResult;    ���������������, ��� ������ ������ �������� ����� � ��������, ��� �� ��
            stdcall;                                                      �� ���������.
            function _AddRef: Integer; stdcall;                              ����� ������� � �������� ����� �� ���� ������������ �������, ����-
            function _Release: Integer; stdcall;                          ��� �������� ��������� ���� ������, ���������� ��������� �����-
            <�������� �������� �����>                                     ���, ��� ������������� �������� COM-�������, ���������� ����� ���-
                                                                          ������� CLSID � ������ ����������.
         end;
                                                                               ���������� 1.4. ������ �������� ���������� �� ���������� �
    <…………>                                                                ����������� �����������, � ������������ ���������� � � ����������-
    function TSomeObject. QueryInterface(const       IID:TGUID;    out    ���. ����� ��������� ��� Windows ����� ��������� � ��������� ��-
    obj):HResult;                                                         �������� �� �������.
    begin
        if GetInterface(IID, Obj) then                                        ������ ����� ������������� ��������� � ���� ������, ��� ������ ��-
        begin                                                             ������ �������, � �������� – ������.
            Result:=S_OK;                                                     ��� ��������� � �������������� ������� ����� ������������ ����-
            _AddRef;                                                      ������� ��������� regedit.exe – �������� ������� (���. 1.3).
        end else Result:=E_NOINTERFACE;
    end;

    function TSomeObject._AddRef: Integer;
    begin
       Inc(FRefCount);
       Result:=FRefCount;
    end;

    function TSomeObject._Release: Integer;
    begin
       Dec(FRefCount);
       Result:=FRefCount;
       if FRefCount=0 then destroy;
    end;
    <…………>
    � ������� ������ ������ TSomeObject, �������������� ���������
ISomeInterface, � �������� ���������� ������� QueryInterface, _AddRef �                          ���. 1.3. �������� �������
_Release.



                                   11                                                                       12