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

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

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

interface IMoniker : IPersistStream { HRESULT BindToObject([in] IBindCtx *pbc, [in, unique] IMoniker *pmkToLeft, [in] REFIID riid, [out, iid_is(riid)] void **ppv);

// remaining methods deleted for clarity

// ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ для ясности

}


НапоминаСм, Ρ‡Ρ‚ΠΎ опрСдСлСния интСрфСйса ΡΠ²Π»ΡΡŽΡ‚ΡΡ абстрактными ΠΈ достаточно Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ мноТСство ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΉ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ сСмантики ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠΠ±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΡƒΡŽ сСмантику BindToObject ΠΌΠΎΠΆΠ½ΠΎ ΡΡ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ: «запусти свой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска ΠΈΠ»ΠΈ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ интСрфСйсный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ создан ΠΈΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Β». Когда ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π’indToObject Π½Π° ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€, Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… прСдставлСний ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ свою Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ структуру Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ИмСя Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Вакая ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½ΠΎΡΡ‚ΡŒ повСдСния ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΠ΄ΠΈΠΎΠΌΡƒ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π° ΡΡ‚ΠΎΠ»ΡŒ дСйствСнной.

ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Ρ‹ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… способов. ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ внСшнСго Π°Π³Π΅Π½Ρ‚Π°, Ρ‚Π°ΠΊΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° Π½Π΅ΠΊΠΎΠ΅ΠΌ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΠ²Π½ΡƒΡŽ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая создаСт ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ просто ΠΈΠΌΠ΅Ρ‚ΡŒ строку тСкста, ΡΠ²Π»ΡΡŽΡ‰ΡƒΡŽΡΡ «строкоподобным» состояниСм ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π°. ПослСдний случай являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ интСрСсным, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ позволяСт прилоТСниям Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Β«ΠΈΠΌΠ΅Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²Β», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ внСшниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ систСмный рССстр, Π² тСкстовом Π²ΠΈΠ΄Π΅ (text-based). Если эта ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ состояния прилоТСния, систСмныС администраторы ΠΈΠ»ΠΈ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ смогут ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ своС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ для поиска ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², которая ΠΌΠΎΠ³Π»Π° Π±Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ прСдусмотрСна Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ исходного прилоТСния. НапримСр, ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ для провСдСния ΠΈΠ½ΠΎΠΉ стратСгии Π²Ρ‹Π±ΠΎΡ€Π° хост-машин простым ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ тСкстовой вСрсии ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π°, которая хранится Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ прилоТСния.

ВСкстовоС прСдставлСниС ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π° Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ называСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ (display name). Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ IMoniker ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ GetDisplayName, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ ΠΎ Π΅Π³ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠΌ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΎΠ»Π΅Π΅ интСрСсная Π·Π°Π΄Π°Ρ‡Π° – ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π² ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Ρ‹. Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° довольно проблСматичная, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ просто ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π° соотвСтствуСт ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя. Π’Π°ΠΊΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ выполняСт MkParseDisplayName – вСроятно, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ваТная API-функция Π²ΠΎ всСм БОМ.

MkParseDisplayName Π±Π΅Ρ€Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€:


HRESULT MkParseDisplayName(

[in] IBindCtx *pbc,

// binding Info – информация ΠΎ связывании

[in, string] const OLECHAR *pwszName,

// object name – имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

[out] ULONG *pcchEaten,

// progress on error – сообщСниС ΠΎΠ± ошибкС

[out] IMoniker **ppmk);

// the resultant moniker – Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€


ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ΠΎΠ² являСтся Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ΠΎΠ². БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ высокого уровня, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² MkParseDisplayName, исслСдуСт прСфикс ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ пытаСтся ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с зарСгистрированным прСфиксом ProgID, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π° соотвСтствуСт Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя. Если прСфиксы ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Ρ‚ΠΎ создаСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ Π΅ΠΌΡƒ присваиваСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя для дальнСйшСго Π°Π½Π°Π»ΠΈΠ·Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ структуру ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½Ρ‹ΠΌΠΈ, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π²Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ΠΎΠ². ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± этой Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠšΠ»ΠΈΠ΅Π½Ρ‚ попросту ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для нахоТдСния искомого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйсный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ IMoniker, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ (composite moniker).

Напомним, Ρ‡Ρ‚ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² класс БОМ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ этого класса. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ классового Ρ‚ΠΈΠΏΠ° (Class Moniker). Π­Ρ‚ΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Ρ‹ встроСнного Ρ‚ΠΈΠΏΠ°, прСдоставляСмыС модСлью БОМ. ΠšΠ»Π°ΡΡΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ CLSID Π² качСствС своСго Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ состояния ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ созданы Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ явной API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ БОМ CreateClassMoniker.


HRESULT CreateClassMoniker([in] REFCLSID rclsid, [out] IMoniker **ppmk);


Π»ΠΈΠ±ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΡ‚ Class Moniker Π² MkParseDisplayName[1]:


clsid:571F1680-CC83-11d0-8C48-0080C73925BA:


ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ прСфикс «сlsidΒ» являСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ProgID для Class Moniker. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ дСмонстрируСт использованиС МkParseDisplayName для создания Class Moniker, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для связи с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса Gorilla:


HRESULT GetGorillaClass(IApeClass * &rpgc)

{ rpgc = 0;

// declare the CLSID for Gorilla as a display name

// объявляСм CLSID ΠΊΠ°ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя для Gorilla

const OLECHAR pwsz[] = OLESTR(Β«clsid:571F1680-CC83-11d0-8C48-0080C73925BA:Β»);

// create a new binding context for parsing

// and binding the moniker

// создаСм Π½ΠΎΠ²Ρ‹ΠΉ ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΉ контСкст

// для Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ связывания ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π°

IBindCtx *pbc = 0;

HRESULT hr = CreateBindCtx(0, &pbc);

if (SUCCEEDED(hr))

{

ULONG cchEaten; IMoniker *pmk = 0;

// ask БОМ to convert the display name to a moniker object

// Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ БОМ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя

// Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π°

hr = MkParseDisplayName(pbc, pwsz, &cchEaten, &pmk);

if (SUCCEEDED(hr))

{

// ask the moniker to find or create the object that it

// refers to // Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ Π½Π°ΠΉΡ‚ΠΈ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚,

// Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ ссылаСтся

hr = pmk->BindToObject(pbc, 0, IID_IApeClass, (void**)&rpgc);

// we now have a pointer to the desired object, so release

// the moniker and the binding context

// Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ

// освобоТдаСм ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ ΠΈ ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΉ контСкст

pmk->Release();

}

pbc->Release();

}

return hr;

}


Π‘Π²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΉ контСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π² MkParseDisplayName ΠΈ IMoniker::BindToObject, являСтся просто Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ связывания ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€Π°. Π’ случаС нашСго простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° всС, Ρ‡Ρ‚ΠΎ трСбуСтся, β€“ это Π½ΠΎΠ²Ρ‹ΠΉ ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΉ контСкст Π² Ρ€ΠΎΠ»ΠΈ заполнитСля (placeholder), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ БОМ CreateBindCtx[2].

Π’ Windows NT 4.0 Π²Π²Π΅Π΄Π΅Π½Π° API-функция, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰Π°Ρ Π²Ρ‹Π·ΠΎΠ²Ρ‹ MkParseDisplayName ΠΈ IMoniker::BindToObject:


HRESULT CoGetObject( [in, string] const OLECHAR *pszName, [in, unique] BIND_OPTS *pBindOptions, [in] REFIID riid, [out, iid_is(riid)] void **ppv);


Π­Ρ‚Π° API-функция Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


// pseudo-code from OLE32.DLL

// псСвдокод из OLE32.DLL

HRESULT CoGetObject(const OLECHAR *pszName, BIND_OPTS *p0pt, REFIID riid, void **ppv)

{

// prepare for failure

// ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° случай сбоя

*ppv = 0;

// create a bind context

// создаСм контСкст связывания

IBindCtx *pbc = 0;

HRESULT hr = CreateBindCtx(0, &pbc);

if (SUCCEEDED(hr))

{

// set bind options if provided

// устанавливаСм ΠΎΠΏΡ†ΠΈΠΈ связывания, Ссли ΠΎΠ½ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ

if (pOpt) hr = pbc->SetBindOptions(pOpt);

if (SUCCEEDED(hr))

{

// convert the display name into a moniker

// ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя Π² ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€

ULONG cch;

IMoniker *pmk = 0;

hr = MkParseDisplayName(pbc, pszName, &cch, &pmk);

if (SUCCEEDED(hr)) {

// ask the moniker to bind to the named object

// Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ€ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ

hr = pmk->BindToObject(pbc, 0, riid, ppv);

pmk->Release();

}

}

pbc->Release();

}

return hr;

}


ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ созданиС Π½ΠΎΠ²ΠΎΠΉ Π³ΠΎΡ€ΠΈΠ»Π»Ρ‹ сводится ΠΊ простому Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CreateInstance:


HRESULT CreateAGorillaAndEatBanana() {

IClassFactory *pcf = 0;

// declare the CLSID for Gorilla as a display name

// объявляСм CLSID ΠΊΠ°ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя для Gorilla

const OLECHAR pwsz[] = OLESTR(Β«clsid:571F1680-CC83-11d0-8C48-0080C73925BA:Β»);

// find the class object via the gorilla's class moniker

// Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Ρ‡Π΅Ρ€Π΅Π· gorilla's class moniker

HRESULT hr = CoGetObject(pwsz, 0, IID_IClassFactory, (void**)&pcf);

if (SUCCEEDED(hr))

{

IApe *pApe = 0;

// use the class object to create a gorilla

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса для создания gorilla

hr = pcf->CreateInstance(0, IID_IApe, (void**)&pApe);

if (SUCCEEDED(hr)) {

// tell the new gorilla to eat a banana

// Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½ΠΎΠ²ΠΎΠΉ Π³ΠΎΡ€ΠΈΠ»Π»Π΅ ΡΡŠΠ΅ΡΡ‚ΡŒ Π±Π°Π½Π°Π½

hr = pApe->EatBanana();

pApe->Release();

}

pcf->Release();

}

return hr;

}



Рисунок 3.5 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ находятся посрСдством ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Visual Basic прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CoGetObject Ρ‡Π΅Ρ€Π΅Π· Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetObject. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° Visual Basic Ρ‚Π°ΠΊΠΆΠ΅ создаСт Π½ΠΎΠ²ΡƒΡŽ gorilla ΠΈ прСдписываСт Π΅ΠΉ Π΅ΡΡ‚ΡŒ Π±Π°Π½Π°Π½Ρ‹:


Sub CreateGorillaAndEatBanana()

Dim gc as IApeClass

Dim ape as IApe

Dim sz as String sz = Β«clsid:571F1680-CC83-11d0-8C48-0080C73925BA:Β»

' get the class object for gorillas

' ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса для gorilla

Set gc = GetObject(sz)

' ask Gorilla class object to create a new gorilla

' Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Gorilla ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ gorilla

Set ape = gc.CreateApe()

' ask gorilla to eat a banana

' просим gorilla Π΅ΡΡ‚ΡŒ Π±Π°Π½Π°Π½Ρ‹

ape.EatBanana

End Sub


ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ вСрсия этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Visual Basic ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ интСрфСйс IApeClass для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Visual Basic Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс IClassFactory ΠΈΠ·-Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ языка.