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

UptoLike

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

k:=m mod 16;
if k<10 then S:=chr(k+48)+S
else S:=chr(57+k)+S;
m:=m div 16;
until m=0;
Str:=WideString(S);
except
result:=false;
end;
end;
6. ɉɪɢɥɨɠɟɧɢɟ ɦɨɠɧɨ ɨɬɤɨɦɩɢɥɢɪɨɜɚɬɶ, ɧɚɠɚɜ ɫɨɱɟɬɚɧɢɟ ɤɥɚɜɢɲ
Ctrl+F9. ɋɨɡɞɚɧɧɵɣ ɩɪɢ ɷɬɨɦ COM-ɫɟɪɜɟɪ, ɧɚɯɨɞɹɳɢɣɫɹ ɜ ɛɢɛɥɢɨ-
ɬɟɤɟ Convert.dll, ɝɨɬɨɜ ɤ ɢɫɩɨɥɶɡɨɜɚɧɢɸ.
ȼ ɞɚɧɧɨɦ ɩɪɢɦɟɪɟ ɢɫɩɨɥɶɡɭɸɬɫɹ ɫɬɪɨɤɢ ɬɢɩɚ WideString. ɗɬɨ ɫɬɚɧ-
ɞɚɪɬɧɵɣ ɫɬɪɨɤɨɜɵɣ ɬɢɩ, ɢɫɩɨɥɶɡɭɟɦɵɣ ɜ ɬɟɯɧɨɥɨɝɢɢ COM. ȼ ɩɪɨɫɬɵɯ
ɫɬɪɨɤɚɯ (String, ShortString, PChar ɢɬ. ɩ.) ɫɢɦɜɨɥɵ ɢɦɟɸɬ ɪɚɡɦɟɪɧɨɫɬɶ
8 ɛɢɬ (1 ɛɚɣɬ), ɚɜ WideString – 16 ɛɢɬ (2 ɛɚɣɬɚ). ɗɬɨ ɞɚɟɬ ɜɨɡɦɨɠɧɨɫɬɶ ɩɟ-
ɪɟɞɚɱɢ ɫɬɪɨɤ ɜ ɤɨɞɢɪɨɜɤɟ Unicode.
2.8. ȼɧɟɲɧɢɟ COM-ɫɟɪɜɟɪɵ
ȼɧɟɲɧɢɟ COM-ɫɟɪɜɟɪɵ ɪɟɚɥɢɡɨɜɚɧɵ ɜ ɜɢɞɟ ɩɪɨɝɪɚɦɦ (exe-ɮɚɣɥɨɜ) ɢ
ɜ ɩɪɨɰɟɫɫɟ ɜɵɩɨɥɧɟɧɢɹ ɡɚɧɢɦɚɸɬ ɚɞɪɟɫɧɨɟ ɩɪɨɫɬɪɚɧɫɬɜɨ, ɨɬɥɢɱɧɨɟ ɨɬ
ɤɥɢɟɧɬɫɤɨɝɨ. ɗɬɨ ɩɪɢɜɨɞɢɬ ɤ ɧɟɤɨɬɨɪɵɦ ɧɸɚɧɫɚɦ ɩɪɢ ɫɨɡɞɚɧɢɢ ɬɚɤɨɝɨ
ɪɨɞɚ COM-ɫɟɪɜɟɪɨɜ.
ȼ ɨɬɥɢɱɢɟ ɨɬ ɜɫɬɪɨɟɧɧɵɯ, ɜɧɟɲɧɢɟ COM-ɫɟɪɜɟɪɵ ɧɟ ɷɤɫɩɨɪɬɢɪɭɸɬ
ɮɭɧɤɰɢɢ DllRegisterServer, DllUnregisterServer, DllGetClassObject ɢ
DllCanUnloadNow.
Ɍɚɤ ɤɚɤ ɤɥɢɟɧɬ ɢ ɜɧɟɲɧɢɣ COM-ɫɟɪɜɟɪ ɧɟ ɦɨɝɭɬ ɩɨɥɭɱɢɬɶ ɩɪɹɦɨɣ
ɞɨɫɬɭɩ ɤ ɚɞɪɟɫɧɨɦɭ ɩɪɨɫɬɪɚɧɫɬɜɭ ɞɪɭɝ ɞɪɭɝɚ, ɫɢɫɬɟɦɚ COM ɩɟɪɟɞɚɟɬ ɞɚɧ-
ɧɵɟ ɦɟɠɞɭ ɧɢɦɢ ɩɨɫɪɟɞɫɬɜɨɦ ɩɪɨɰɟɫɫɚ, ɧɚɡɵɜɚɟɦɨɝɨ ɦɚɪɲɚɥɢɧɝɨɦ
1
.
ɋɢɫɬɟɦɚ COM, ɪɟɚɥɢɡɨɜɚɧɧɚɹ ɜ ɨɩɟɪɚɰɢɨɧɧɨɣ ɫɢɫɬɟɦɟ Windows, ɦɨɠɟɬ
ɩɟɪɟɞɚɜɚɬɶ ɩɨɫɪɟɞɫɬɜɨɦ ɦɚɪɲɚɥɢɧɝɚ ɩɟɪɟɦɟɧɧɵɟ ɫɥɟɞɭɸɳɢɯ ɬɢɩɨɜ: Smal-
lint, Integer, Single, Double, Currency, TdateTime, WideString, IDispatch,
SCODE, WordBool, OleVariant, IUnknown, ShortInt, Byte, Word, UINT, int64,
Largeint, SYSINT, SYSUINT, HResult, Pointer, SafeArray, PChar, PWideChar.
ɋɥɟɞɭɟɬ ɨɬɦɟɬɢɬɶ, ɱɬɨ ɜɫɟ ɩɟɪɟɱɢɫɥɟɧɧɵɟ ɬɢɩɵ ɨɬɧɨɫɹɬɫɹ ɤ ɤɚɬɟɝɨ-
ɪɢɢ ɩɪɨɫɬɵɯ ɬɢɩɨɜ, ɬɚɤ ɤɚɤ ɦɚɪɲɚɥɢɧɝ ɩɟɪɟɦɟɧɧɵɯ ɫɥɨɠɧɵɯ ɬɢɩɨɜ (ɦɚɫ-
ɫɢɜɵ, ɡɚɩɢɫɢ, ɫɬɪɭɤɬɭɪɵ ɢ ɬ. ɩ.) ɫɢɫɬɟɦɚ COM ɧɟ ɩɨɞɞɟɪɠɢɜɚɟɬ. ȿɫɥɢ ɜɫɟ-
ɬɚɤɢ ɬɪɟɛɭɟɬɫɹ ɩɟɪɟɞɚɬɶ ɞɚɧɧɵɟ ɬɢɩɚ ɡɚɩɢɫɶ ɢɥɢ ɦɚɫɫɢɜ, ɧɭɠɧɨ ɫɚɦɨɫɬɨɹ-
ɬɟɥɶɧɨ ɡɚɩɪɨɝɪɚɦɦɢɪɨɜɚɬɶ ɩɨɞɞɟɪɠɤɭ ɦɟɯɚɧɢɡɦɚ ɦɚɪɲɚɥɢɧɝɚ ɞɥɹ ɬɚɤɢɯ
1
Ɉɬ ɫɥɨɜɚ Marshaling – ɜɵɫɬɪɚɢɜɚɧɢɟ ɜ ɨɩɪɟɞɟɥɟɧɧɨɦ ɩɨɪɹɞɤɟ.
27
ɫɬɪɭɤɬɭɪ. Ⱦɥɹ ɷɬɨɝɨ ɩɨɧɚɞɨɛɢɬɫɹ ɢɧɬɟɪɮɟɣɫ IMarshal. ȼ ɞɚɧɧɨɦ ɦɟɬɨɞɢ-
ɱɟɫɤɨɦ ɩɨɫɨɛɢɢ ɪɟɚɥɢɡɚɰɢɹ ɦɚɪɲɚɥɢɧɝɚ ɪɚɫɫɦɚɬɪɢɜɚɬɶɫɹ ɧɟ ɛɭɞɟɬ.
ȼɧɟɲɧɢɟ COM-ɫɟɪɜɟɪɵ, ɤɚɤ ɢ ɨɛɵɱɧɵɟ ɩɪɢɥɨɠɟɧɢɹ, ɦɨɠɧɨ ɡɚɤɪɵɬɶ
ɫɚɦɨɫɬɨɹɬɟɥɶɧɨ, ɧɨ ɟɫɥɢ ɧɚ ɤɨɦɩɨɧɟɧɬɵ ɫɟɪɜɟɪɚ ɫɫɵɥɚɸɬɫɹ ɤɥɢɟɧɬɵ, ɬɨ
ɫɢɫɬɟɦɚ ɜɵɞɚɟɬ ɫɨɨɬɜɟɬɫɬɜɭɸɳɟɟ ɫɨɨɛɳɟɧɢɟ (ɪɢɫ. 2.3).
Ɋɢɫ. 2.3. ɉɪɟɞɭɩɪɟɠɞɟɧɢɟ, ɜɵɡɵɜɚɟɦɨɟ ɩɪɢ ɡɚɤɪɵɬɢɢ ɜɧɟɲɧɟɝɨ
COM-ɤɥɢɟɧɬɚ, ɟɫɥɢ ɧɚ ɤɨɦɩɨɧɟɧɬɵ ɫɟɪɜɟɪɚ ɫɫɵɥɚɸɬɫɹ ɤɥɢɟɧɬɵ
ɉɪɢɦɟɪ ɜɧɟɲɧɟɝɨ COM-ɫɟɪɜɟɪɚ ɛɭɞɟɬ ɩɪɢɜɟɞɟɧ ɜ ɩɹɬɨɣ ɝɥɚɜɟ, ɬɚɤ
ɤɚɤ ɞɥɹ ɪɟɚɥɢɡɚɰɢɢ ɬɚɤɢɯ ɫɟɪɜɟɪɨɜ ɬɪɟɛɭɟɬɫɹ ɛɢɛɥɢɨɬɟɤɚ ɬɢɩɨɜ, ɤɨɬɨɪɚɹ
ɛɭɞɟɬ ɪɚɫɫɦɨɬɪɟɧɚ ɜ ɝɥ. III.
2.9. Ȼɟɡɨɩɚɫɧɵɟ ɦɚɫɫɢɜɵ (SafeArray)
Ȼɟɡɨɩɚɫɧɵɟ ɦɚɫɫɢɜɵ (ɬɢɩ SafeArray) ɪɟɚɥɢɡɨɜɚɧɵ ɧɚ ɨɫɧɨɜɟ ɜɚɪɢɚɧɬ-
ɧɵɯ ɦɚɫɫɢɜɨɜ. ɉɪɨɰɟɞɭɪɵ ɢ ɮɭɧɤɰɢɢ ɞɥɹ ɪɚɛɨɬɵ ɫ ɜɚɪɢɚɧɬɧɵɦɢ ɦɚɫɫɢ-
ɜɚɦɢ ɩɪɢɜɟɞɟɧɵ ɜ ɫɥɟɞɭɸɳɟɣ ɬɚɛɥɢɰɟ.
ɉɨɞɩɪɨɝɪɚɦɦɚ Ɉɩɢɫɚɧɢɟ
ɋɨɡɞɚɟɬ ɜɚɪɢɚɧɬɧɵɣ ɦɚɫɫɢɜ.
ɉɚɪɚɦɟɬɪ Bounds ɫɨɞɟɪɠɢɬ
ɪɚɡɦɟɪɧɨɫɬɶ ɦɚɫɫɢɜɚ. ɉɚɪɚ-
ɦɟɬɪ VarType ɨɩɪɟɞɟɥɹɟɬ
ɬɢɩ ɯɪɚɧɢɦɵɯ ɞɚɧɧɵɯ
function VarArrayCreate(const Bounds: ar-
ray of Integer; VarType: TVarType): Vari-
ant;
ɋɨɡɞɚɟɬ ɨɞɧɨɦɟɪɧɵɣ
ɜɚɪɢɚɧɬɧɵɣ ɦɚɫɫɢɜ ɢɡ
ɷɥɟɦɟɧɬɨɜ Values.
ɂɧɞɟɤɫɚɰɢɹ
function VarArrayOf(const Values: array
of Variant): Variant;
ɧɚɱɢɧɚɟɬɫɹ ɫ
ɧɭɥɹ
ȼɨɡɜɪɚɳɚɟɬ ɫɫɵɥɤɭ ɧɚ ɜɚɪɢ-
ɚɧɬɧɵɣ ɦɚɫɫɢɜ
function VarArrayRef(const A: Variant):
Variant;
function VarArrayDimCount(const A:
Variant): Integer;
ȼɨɡɜɪɚɳɚɟɬ ɤɨɥɢɱɟɫɬɜɨ ɢɡ-
ɦɟɪɟɧɢɣ ɜ ɜɚɪɢɚɧɬɧɨɦ ɦɚɫ-
ɫɢɜɟ ȼ ɫɥɭɱɚɟ, ɟɫɥɢ ɷɬɨ ɧɟ
ɦɚɫɫɢɜ, ɜɨɡɜɪɚɳɚɟɬ 0
28
                   k:=m mod 16;                                               ��������. ��� ����� ����������� ��������� IMarshal. � ������ ������-
                   if k<10 then S:=chr(k+48)+S                                ������ ������� ���������� ���������� ��������������� �� �����.
                            else S:=chr(57+k)+S;                                  ������� COM-�������, ��� � ������� ����������, ����� �������
                   m:=m div 16;                                               ��������������, �� ���� �� ���������� ������� ��������� �������, ��
               until m=0;                                                     ������� ������ ��������������� ��������� (���. 2.3).
               Str:=WideString(S);
             except
               result:=false;
             end;
          end;
     6. ���������� ����� ���������������, ����� ��������� ������
        Ctrl+F9. ��������� ��� ���� COM-������, ����������� � ������-
        ���� Convert.dll, ����� � �������������.
     � ������ ������� ������������ ������ ���� WideString. ��� ����-               ���. 2.3. ��������������, ���������� ��� �������� ��������
������� ��������� ���, ������������ � ���������� COM. � �������                    COM-�������, ���� �� ���������� ������� ��������� �������
������� (String, ShortString, PChar � �. �.) ������� ����� �����������
8 ��� (1 ����), � � WideString – 16 ��� (2 �����). ��� ���� ����������� ��-       ������ �������� COM-������� ����� �������� � ����� �����, ���
������ ����� � ��������� Unicode.                                             ��� ��� ���������� ����� �������� ��������� ���������� �����, �������
                                                                              ����� ����������� � ��. III.
                        2.8. ������� COM-�������
                                                                                            2.9. ���������� ������� (SafeArray)
      ������� COM-������� ����������� � ���� �������� (exe-������) �
� �������� ���������� �������� �������� ������������, �������� ��                 ���������� ������� (��� SafeArray) ����������� �� ������ �������-
�����������. ��� �������� � ��������� ������� ��� �������� ������             ��� ��������. ��������� � ������� ��� ������ � ����������� �����-
���� COM-��������.                                                            ���� ��������� � ��������� �������.
      � ������� �� ����������, ������� COM-������� �� ������������
                                                                                 ������������                             ��������
������� DllRegisterServer, DllUnregisterServer, DllGetClassObject �
                                                                              function VarArrayCreate(const Bounds: ar- ������� ���������� ������.
DllCanUnloadNow.
      ��� ��� ������ � ������� COM-������ �� ����� �������� ������            ray of Integer; VarType: TVarType): Vari- �������� Bounds ��������
                                                                              ant;                                      ����������� �������. ����-
������ � ��������� ������������ ���� �����, ������� COM �������� ���-
                                                                                                                        ���� VarType ����������
��� ����� ���� ����������� ��������, ����������� ����������� 1 .
                                                                                                                        ��� �������� ������
      ������� COM, ������������� � ������������ ������� Windows, �����
���������� ����������� ���������� ���������� ��������� �����: Smal-           function VarArrayOf(const Values: array   ������� ����������
lint, Integer, Single, Double, Currency, TdateTime, WideString, IDispatch,    of Variant): Variant;                     ���������� ������ ��
SCODE, WordBool, OleVariant, IUnknown, ShortInt, Byte, Word, UINT, int64,                                               ��������� Values.
Largeint, SYSINT, SYSUINT, HResult, Pointer, SafeArray, PChar, PWideChar.                                               ���������� ���������� �
      ������� ��������, ��� ��� ������������� ���� ��������� � ������-        function VarArrayRef(const A: Variant):   ����
                                                                                                                        ���������� ������ �� ����-
��� ������� �����, ��� ��� ��������� ���������� ������� ����� (���-           Variant;                                  ������ ������
����, ������, ��������� � �. �.) ������� COM �� ������������. ���� ���-                                               ���������� ���������� ��-
���� ��������� �������� ������ ���� ������ ��� ������, ����� ��������-         function VarArrayDimCount(const A:     ������� � ���������� ���-
������ ����������������� ��������� ��������� ���������� ��� �����              Variant): Integer;                     ���� � ������, ���� ��� ��
1
                                                                                                                      ������, ���������� 0
    �� ����� Marshaling – ������������ � ������������ �������.
                                          27                                                                    28