Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ БОМ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор Π”ΠΎΠ½Π°Π»ΡŒΠ΄ Бокс

virtual HRESULT stdcall Method2(short arg1, short *parg2) = 0;


Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ клиСнтский ΠΊΠΎΠ΄ Π½Π° языкС C++:


short sum = 10;

short s;

HRESULT hr = pItf->Method2(20, &s);

if (FAILED(hr)) throw hr;

sum += s;


ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ эквивалСнтСн Ρ‚Π°ΠΊΠΎΠΌΡƒ Java-ΠΊΠΎΠ΄Ρƒ:


short sum == 10; short s = Itf.Method2(20); sum += s;


Если HRESULT, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, сообщаСт ΠΎΠ± Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Ρ‚ΠΎ Java Virtual Machine ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ HRESULT Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Java. Π’ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π½Π° языкС C++ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ HRESULT, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ этим ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ этот Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.


Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΈ IDL

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² IDL ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Π½Π°Π»ΠΎΠ³Π°ΠΌΠΈ Π‘-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ интСрфСйсов Π² IDL Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π‘, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π‘ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ встроСнной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ этого понятия. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ интСрфСйса Π² IDL начинаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова interface. Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ состоит ΠΈΡ… Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… частСй: имя интСрфСйса, Π±Π°Π·ΠΎΠ²ΠΎΠ΅ имя интСрфСйса, Ρ‚Π΅Π»ΠΎ интСрфСйса ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ интСрфСйса. Π’Π΅Π»ΠΎ интСрфСйса прСдставляСт собой просто Π½Π°Π±ΠΎΡ€ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ²:

[ attribute1, attribute2, …]

interface IThisInterface : IBaseInterface

{

typedef1;

typedef2;

:

:

method1;

method2;

}

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ интСрфСйс БОМ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° IDL. Атрибут [object] слуТит ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ интСрфСйс являСтся БОМ-, Π° Π½Π΅ DCE-интСрфСйсом. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° физичСскоС имя интСрфСйса (Π² ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ IDL-Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ IThisInterface являСтся логичСским ΠΈΠΌΠ΅Π½Π΅ΠΌ интСрфСйса).

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ БОМ-интСрфСйсы Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ физичСскоС имя, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ логичСского ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. Π”Π²Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ интСрфСйс, ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€. Π”Π²Π° ΠΈΡ… опрСдСлСния интСрфСйса Π±ΡƒΠ΄ΡƒΡ‚, вСроятно, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌΠΈ, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ области, Π½ΠΎ скорСС всСго фактичСский порядок ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, сигнатур ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π² Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ. НСсмотря Π½Π° это, ΠΎΠ±Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, вСроятно, Π²Ρ‹Π±Π΅Ρ€ΡƒΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ логичСскоС имя: ICalculator.

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° машинС ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ интСрфСйса ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, Π° Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, созданный Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π° интСрфСйса ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ логичСскоС имя, Ρ‚ΠΎ Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ запросит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ICalculator, просто использовав строку Β«ICalculatorΒ», ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ Π½Π° запрос Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ указатСля интСрфСйса. Однако прСдставлСниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎ Ρ‚ΠΎΠΌ, Π½Π° Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆ ICalculator, вступит Π² ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠ΅ прСдставлСниС ΠΎ Π½Π΅ΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚. Π’Π΅Π΄ΡŒ эти Π΄Π²Π° интСрфСйса ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ логичСскоС имя.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ коллизию ΠΈΠΌΠ΅Π½, всСм БОМ-интСрфСйсам Π½Π° этапС проСктирования назначаСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся физичСским ΠΈΠΌΠ΅Π½Π΅ΠΌ интСрфСйса. Π­Ρ‚ΠΈ физичСскиС ΠΈΠΌΠ΅Π½Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ глобально ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (Globally Unique Identifiers – GUIDs), Ρ‡Ρ‚ΠΎ рифмуСтся со словом squids [1]. GUID ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² БОМ ΠΏΠΎΠ²ΡΡŽΠ΄Ρƒ для имСнования статичСских сущностСй, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ интСрфСйсы ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. GUID ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ большими 128-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ числами, Ρ‡Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚Π°ΠΊ ΠΈ Π² пространствС. GUID Π² БОМ основаны Π½Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°Ρ… (Universally Unique Identifiers – UUIDs), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² DCE RPC. ΠŸΡ€ΠΈ использовании GUID для имСнования БОМ-интСрфСйсов ΠΈΡ… часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ интСрфСйса (Interface IDs – IIDs). Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² БОМ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π½ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GUID, ΠΈ Π² этом случаС GUID Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ класса (Class IDs – CLSIDs ). Π‘ΡƒΠ΄ΡƒΡ‡ΠΈ прСдставлСнными Π² тСкстовой Ρ„ΠΎΡ€ΠΌΠ΅, GUID всСгда ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ каноничСский Π²ΠΈΠ΄: BDA4A270-A1BA-11d0-8C2C-0080C73925BA

Π­Ρ‚ΠΈ 32 ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ 128-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ GUID. ИмСнованиС интСрфСйсов ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GUID Π²Π°ΠΆΠ½ΠΎ для прСдотвращСния ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ.

Для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ GUID Π² БОМ имССтся API-функция, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для гСнСрирования Π½ΠΎΠ²ΠΎΠ³ΠΎ 128-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ числа, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° большС Π½Π΅ встрСтится Π² ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅:

HRESULT CoCreateGuid(GUID *pguid);

Алгоритм, задСйствованный Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CoCreateGuid, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСтСвой интСрфСйсный адрСс ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ машинноС врСмя ΠΈ Π΄Π²Π° постоянных счСтчика для компСнсации точности часов ΠΈ нСстандартных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π² Π½ΠΈΡ… (Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π»Π΅Ρ‚Π½Π΅Π΅ врСмя ΠΈΠ»ΠΈ ручная коррСкция систСмных часов). Если данная машина Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ сСтСвого интСрфСйса, Ρ‚ΠΎ синтСзируСтся статистичСски ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° ΠΈ CoCreateGuid Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ особого Π²ΠΈΠ΄Π° HRESULT, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ данная Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° являСтся глобально ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статистичСски ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ использовании Π½Π° локальной машинС. Π₯отя прямой Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CoCreateGuid ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅Π·Π΅Π½, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Π΅Π΅ Π² нСявной Ρ„ΠΎΡ€ΠΌΠ΅, примСняя ΠΈΠ· SDK ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ GUIDGEN.EXE. На рис. 2.3 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° GUIDGEN. GUIDGEN Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ CoCreateGuid ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ GUID Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² исходный ΠΊΠΎΠ΄ Π½Π° C++ ΠΈΠ»ΠΈ IDL. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π² IDL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (каноничСская тСкстовая Ρ„ΠΎΡ€ΠΌΠ°).



Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ физичСскоС имя интСрфСйса с Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π° IDL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ интСрфСйса – [uuid] . Атрибут [uuid] содСрТит ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ – ΠΊΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ


GUID: [object, uuid(BDA4A270-A1BA-11dO-8C2C-0080C73925BA)]

interface ICalculator : IBaseInterface

{

HRESULT Clear(void);

HRESULT Add([in] long n);

HRESULT Sum([out, retval] long *pn);

}


ΠŸΡ€ΠΈ использовании ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° Π‘ ΠΈΠ»ΠΈ C++ физичСского ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса IID Π΄Π°Π½Π½ΠΎΠ³ΠΎ интСрфСйса прСдставляСт собой просто логичСскоС имя интСрфСйса, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅ΠΌΠΎΠ΅ прСфиксом IID_. НапримСр, интСрфСйс ICalculator Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ IID, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ IDL константу IID_ICalculator. Для прСдотвращСния ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ символичСскими ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ интСрфСйсов ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пространство ΠΈΠΌΠ΅Π½ C++.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ лишь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· компиляторов C++ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ 128-Π±ΠΈΡ‚Π½Ρ‹Π΅ числа, БОМ опрСдСляСт Π‘-структуру для прСдставлСния 128-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ GUID ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ псСвдонимы для Ρ‚ΠΈΠΏΠΎΠ² IID ΠΈ CLSID с использованиСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ²:

typedef struct GUID

{

DWORD Data1;

WORD Data2;

WORD Data3;

BYTE Data4[8];

} GUID;

typedef GUID IID;

typedef GUID CLSID;


ВнутрСнняя структура GUID для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° программистов нСсущСствСнна, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ СдинствСнная значимая опСрация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с GUID, β€“ это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈΡ… эквивалСнтности. Для обСспСчСния эффСктивной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ GUID ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ БОМ прСдусматриваСт Ρ‚Π°ΠΊΠΆΠ΅ постоянныС псСвдонимы для ссылок (constant reference aliases) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° GUID:


#define REFGUID const GUID&

#define REFIID const IID&

#define REFCLSID const CLSID&


Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ GUID, БОМ обСспСчиваСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ эквивалСнтности ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ == ΠΈ != для постоянных ссылок GUID:


inline BOOL IsEqualGUID(REFGUID r1, REFGUID r2)

{

return !memcmp(&r1, &r2, sizeof(GUID));

}

#def1ne IsEqualIID(r1, r2) IsEqualGUID((r1) , (r2))

#define IsEqualCLSID(r1, r2) IsEqualGUID((r1), (r2))

inline BOOL operator == (REFGUID r1, REFGUID r2)

{

return !memcmp(&r1, &r2, sizeof(GUID));

}

inline BOOL operator != (REFGUID r1, REFGUID r2)

{

return !(r1 == r2);

}


ЀактичСскиС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ SDK содСрТат условно ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ совмСстимыС с Π‘ вСрсии ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ°, макросов ΠΈ встраиваСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ прСдставлСния ΠΈΠΌΠ΅Π½ интСрфСйсов Π½Π° этапС выполнСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ GUID, Π° Π½Π΅ строками; это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Dynamic_Cast, описанный Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅, слСдуСт ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, вСсь интСрфСйс IΠ•Ρ…tensibleObject Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² свой Π°Π½Π°Π»ΠΎΠ³ IUnknown, совмСстимый с БОМ. 


Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ IUnknown

БОМ-интСрфСйс IUnknown ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ интСрфСйс IExtensibleObject, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅. ПослСдняя вСрсия IExtensibleObject, появившаяся Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Ρ‹, ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄:


class IExtensibleObject

{

public:

virtual void *Dynamic_Cast(const char* pszType) = 0;

virtual void DuplicatePointer(void) = 0;

virtual void DestroyPointer(void) = 0;

}


Для опрСдСлСния Ρ‚ΠΈΠΏΠ° Π½Π° этапС выполнСния Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Dynamic_Cast, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ C++ dynamic_cast. Для извСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ интСрфСйса дублировался, использовался ΠΌΠ΅Ρ‚ΠΎΠ΄ DuplicatePointer. Для сообщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ интСрфСйса ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ ΠΈ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠΌ рСсурсы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ освобоТдСны, Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ DestroyPointer. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ IUnknown Π½Π° C++:


extern "Π‘" const IID IID_IUnknown: interface IUnknown