ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 4
- 5
- 6
- 7
- 8
- …
- следующая ›
- последняя »
