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

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

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

HRESULT CoTreatAsClass([in] REFCLSID rclsidOld, [in] REFCLSID rclsidNew);


ΠŸΡƒΡΡ‚ΡŒ Π‘himp2 являСтся Π½ΠΎΠ²ΠΎΠΉ вСрсиСй класса Chimp, Ρ‚ΠΎΠ³Π΄Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ БОМ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ запросы Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ Chimp Π½Π° запросы Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ Chimp2:


// cause Chimp activation calls to activate Chimp2

// заставим запросы Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ Chimp Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Chimp2

HRESULT hr = CoTreatAsClass(CLSID_Chimp, CLSID_Chimp2);


Π­Ρ‚Π° API-функция добавляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ»ΡŽΡ‡ рССстра (registry key)


[HKCR\CLSID\{CLSID_Chimp}\TreatAs][1] @={CLSID_Chimp2}


Π’Ρ‹Π·ΠΎΠ² CoTreatAsClass c CLSID_NULL Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° удаляСт настройку TreatAs:


// cause Chimp activation calls to activate Chimps

// заставим запросы Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ Chimp

// Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Chimps

HRESULT hr = CoTreatAsClass(CLSID_Chimp, CLSID_NULL);


Π­Ρ‚ΠΎΡ‚ запрос восстанавливаСт ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса Π² состояниС, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ эмуляции. ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ установку эмуляции Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CoGetTreatAsClass:


HRESULT CoGetTreatAsClass ([in] REFCLSID rclsidOld, [out] REFCLSID *pclsidNew);


Если Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹ΠΉ класс эмулируСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ классом, Ρ‚ΠΎ CLSID ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ класса Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ посрСдством Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ вся ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ S_OK . Если ΠΆΠ΅ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹ΠΉ класс Π½Π΅ эмулируСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ классом, Ρ‚ΠΎ посрСдством Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ исходный CLSID ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ S_FALSE. НСобходимо Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания этой ΠΊΠ½ΠΈΠ³ΠΈ эмуляция классов Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ для ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… запросов Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ.


ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

Как ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π»ΠΎΡΡŒ Π² этой Π³Π»Π°Π²Π΅, основныС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ БОМ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΈ создании Π½ΠΎΠ²Ρ‹Ρ… экзСмпляров класса Π±Ρ‹Π»ΠΎ извСстно Π΅Π³ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ имя. Иногда, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ просто ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ подходящим являлся любой класс, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ сСмантичСским ограничСниям. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ запрос Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ сСрвисныС срСдства класс Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ своих ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Π’ этом случаС Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ Π³ΠΎΡ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ послуТили ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ для создания ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (component categories).

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

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π΅ΡΡ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΠ° логичСски родствСнных БОМ-классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ±Ρ‰ΠΈΠΉ ID ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, ΠΈΠ»ΠΈ CATID. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ CATID – это GUID, записанныС Π² рССстрС ΠΊΠ°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ класса. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°: Implemented Categories ΠΈ Required Categories (Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ). ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²: Simians ΠΈ Mammals (ΠΏΡ€ΠΈΠΌΠ°Ρ‚Ρ‹ ΠΈ ΠΌΠ»Π΅ΠΊΠΎΠΏΠΈΡ‚Π°ΡŽΡ‰ΠΈΠ΅). КаТдая ΠΈΠ· этих Π΄Π²ΡƒΡ… ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ CATID (CATID_Simians ΠΈ CATID_Mammals соотвСтствСнно). Допустим, Ρ‡Ρ‚ΠΎ класс Chimp являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· этих ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ, ΠΈ Ρ‚ΠΎΠ³Π΄Π° для Chimp ΠΊΠ»ΡŽΡ‡ рССстра Implemented Categories Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² сСбС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ GUID ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡:


[HKCR\CLSID\{CLSID_Chimp}\Implemented Categories\{CATID_Mammals}]

[HKCR\CLSID\{CLSID_Chimp}\Implemented Categories\{CATID_Simians}]


Π­Ρ‚ΠΈ элСмСнты рССстра ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π²ΠΎ врСмя саморСгистрации. КаТдая извСстная катСгория ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² систСмС ΠΈΠΌΠ΅Π΅Ρ‚ запись Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ рССстра HKEY_CLASSES_ROOT\Component Categories

КаТдая катСгория ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡, Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°ΠΊ CATID. Под этим ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΎΠΌ каТдая катСгория ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π²Π΅Π»ΠΈΡ‡ΠΈΠ½, содСрТащих тСкстовоС описаниС этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. НапримСр, Π΄Π²ΡƒΠΌ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ катСгориям понадобятся Ρ‚Π°ΠΊΠΈΠ΅ элСмСнты рССстра:


[HKCR\Component Categories\{CATID_Mammals}] 409="Bears live young"

[HKCR\Component Categones\{CATID_Simians}] 409="Eats Bananas"


ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° 409, ΡΠ²Π»ΡΡŽΡ‰Π°ΡΡΡ ΠΊΠΎΠ΄ΠΎΠΌ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ языка LCID (locale identifier), для U.S.English. Другая мСстная спСцифика ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡƒΡ‚Π΅ΠΌ добавлСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π²Π΅Π»ΠΈΡ‡ΠΈΠ½.

ΠšΠ»Π°ΡΡΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ такая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²ΠΈΠ΄ ΡƒΠ·Π»ΠΎΠ²Ρ‹Ρ… интСрфСйсов (site interfaces), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ прСдоставляСт Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ эти прСдоставляСмыС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ сСрвисы Π½Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, Π½Π΅ зависящиС ΠΎΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ интСрфСйса, БОМ позволяСт классам ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚ΠΈΠΏ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ID; ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ сСрвисов, прСдоставляСмых ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ: CATID_HasOxygen ΠΈ CATID_HasWater. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для выТивания шимпанзС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ кислород ΠΈ Π²ΠΎΠ΄Π°, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Chimp Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ эти Π΄Π²Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ сСрвисов, прСдоставляСмых ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈΠ· Required Categories:


[HKCR\CLSID\{CLSID_Chimp}\Required Categories\{CATID_HasOxygen}]

[HKCR\CLSID\{CLSID_Chimp}\Required Categories\{CATID_HasWater}]


ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ID этих Π΄Π²ΡƒΡ… ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ слСдуСт внСсти Π² рССстр ΠΏΠΎΠ΄ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ HKEY_CLASSES_ROOT\Component Categories

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² эти записи, сам ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠ΅ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ удовлСтворяСт Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹ΠΌ катСгориям. БОМ Π½Π΅ обСспСчиваСт согласованиС с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ зарСгистрированы Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ явных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ рССстра, Π»ΠΈΠ±ΠΎ с использованиСм ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ БОМ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (component category manager). Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² БОМ ΠΊΠ°ΠΊ создаваСмый БОМ-класс (CLSID_StdComponentCategoriesMgr), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс ICatRegister для рСгистрации ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΈ интСрфСйс ICatInformation для запроса ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ICatRegister позволяСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ DLL сСрвСра Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² рССстр Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ элСмСнты:


[object, uuid(0002E012-0000-0000-C000-000000000046)]

interface ICatRegister : IUnknown {

// description info for a category

// ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ информация для ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ

typedef struct tagCATEGORYINFO

{ CATID catid; LCID lcid; OLECHAR szDescription[128]; }

CATEGORYINFO;

// register cCts category descriptions

// рСгистрируСм описания ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ cCts

HRESULT RegisterCategories([in] ULONG cCts,

[in, size_is(cCts)] CATEGORYINFO rgCatInfo[]);

// unregister cCategories category descriptions

// отмСняСм Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ описаний ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ

cCategories HRESULT UnRegisterCategories([in] ULONG cCategories,

[in, size_is(cCategories)] CATID rgcatid[]);

// indicate a class implements one or more categories

// ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ

HRESULT RegisterClassImplCategories([in] REFCLSID rclsid,

[in] ULONG cCategories,

[in, size_is(cCategories)] CATID rgcatid[]);

// deindicate a class implements one or more categories

// пСрСстаСм ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ класс ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ

HRESULT UnRegisterClassImplCategories([in] REFCLSID rclsd,

[in] ULONG cCategories,

[in, size_is(cCategories)] CATID rgcatid[]);

// indicate a class requires one or more categories

// ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ класс Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ

HRESULT RegisterClassReqCategories([in] REFCLSID rclsid,

[in] ULONG cCategories,

[in, size_is(cCategories)] CATID rgcatid[]):

// deindicate a class requires one or more categories

// пСрСстаСм ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π»ΠΈ класс ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ

HRESULT UnRegisterClassReqCategones([in] REFCLSID rclsid,

[in] ULONG cCategories,

[in, size_is(cCategories)] CATID rgcatid[]); }


Для опрСдСляСмых ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ БОМ-классов Π½Π΅Ρ‚ нСобходимости Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ этот интСрфСйс. Он сущСствуСт СдинствСнно для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвСры смогли сами Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с использованиСм Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прСдоставляСмого БОМ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Π’ случаС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с Chimp ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ зарСгистрируСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ:


// get the standard category manager

// ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ стандартный ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ

ICatRegister *pcr = 0; HRESULT hr = CoCreateInstance(

CLSID_StdComponentCategoriesMgr, 0,

CLSCTX_ALL, IID_ICatRegister, (void**)&pcr); if (SUCCEEDED(hr)) {

// build descriptions of each category

// Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ описания ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ

CATECORYINFO rgcc[4];

rgcc[0].catid = CATID_Simian;

rgcc[1].catid = CATID_Mammal;

rgcc[2].catid = CATID_HasOxygen;

rgcc[3].catid = CATID_HasWater;

rgcc[0].lcid = rgcc[1].lcid = rgcc[2].lcid = rgcc[3].lcid = 0Ρ…409;

wcscpy(rgcc[0].szDescription, OLESTR(Β«Eats BananasΒ»));

wcscpy(rgcc[1].szDescription, OLESTR(Β«Bears live youngΒ»));

wcscpy(rgcc[2].szDescription, OLESTR(Β«Provides OxygenΒ»));

wcscpy(rgcc[3].szDescription, OLESTR(Β«Provides WaterΒ»));

// register information regarding categories

// рСгистрируСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ катСгориях

pcr->RegisterCategories(4, rgcc);

// note that Chimps are Simians and mammals

// ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Chimps (шимпанзС) ΡΠ²Π»ΡΡŽΡ‚ΡΡ Simian

// (обСзьянами) ΠΈ Mammal (ΠΌΠ»Π΅ΠΊΠΎΠΏΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ)

CATID rgcid[2];