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

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

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

Когда CoMarshalInterface Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ опрСдСляСт, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΆΠ΅Π»Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартный ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³, Ρ‚ΠΎ создаСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ БОМ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ администратор Π·Π°Π³ΡƒΡˆΠ΅ΠΊ (stub manager). Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ всСми интСрфСйсными Π·Π°Π³Π»ΡƒΡˆΠΊΠ°ΠΌΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ дСйствуСт ΠΊΠ°ΠΊ идСнтификационная Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΎ всСй сСти ΠΈ СдинствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ идСнтифицируСтся Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠžΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Object Identifier – OID), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΎ всСх Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π°Ρ…. ΠœΠ΅ΠΆΠ΄Ρƒ администраторами Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ БОМ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² имССтся Π²Π·Π°ΠΈΠΌΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ΅ соотвСтствиС. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ ссылаСтся Π½Π° Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ БОМ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ БОМ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ стандартный ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ. Администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ содСрТит Π½ΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄Π½Ρƒ Π½Π΅ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΡƒΡŽ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, которая ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ рСсурсы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² памяти. Π’ этом смыслС администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ являСтся Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ внутрипроцСссным ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ слСдит Π·Π° числом нСосвобоТдСнных Π²Π½Π΅ΡˆΠ½ΠΈΡ… ссылок ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π³Π΄Π΅-Π»ΠΈΠ±ΠΎ Π² сСти останСтся хотя Π±Ρ‹ ΠΎΠ΄Π½Π° нСосвобоТдСнная ссылка. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ссылок ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто замСститСлями, хотя ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ ссылки ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ замСститСля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΅Ρ‰Π΅ сущСствуСт. Когда нСосвобоТдСнныС замСститСли ΠΈΠ»ΠΈ ссылки ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ, администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ извСщаСтся ΠΎΠ± этом ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ свой счСтчик Π²Π½Π΅ΡˆΠ½ΠΈΡ… ссылок. Если ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Π° послСдняя внСшняя ссылка Π½Π° администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ, Ρ‚ΠΎ послСдний самоуничтоТаСтся, освобоТдая свои нСосвобоТдСнныС ссылки Π½Π° Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π­Ρ‚ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ эффСкт наличия Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ссылок, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ явного контроля Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅.

Администратор Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ дСйствуСт лишь ΠΊΠ°ΠΊ сСтСвой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ ORPC-запросы, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°[1]. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ ORPC-запросы Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, администратору Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ Π½ΡƒΠΆΠ΅Π½ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π½Π°Π΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΠΈ сигнатур интСрфСйсных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π­Ρ‚ΠΎΡ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ называСтся интСрфСйсной Π·Π°Π³Π»ΡƒΡˆΠΊΠΎΠΉ (interface stub). Он Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π΄Π΅ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ [in], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π±Π»ΠΎΠΊΠ΅ ORPC-запроса, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ HRESULT ΠΈ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ [out] Π² ΠΎΡ‚Π²Π΅Ρ‚Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ORPC. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹Π΅ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹Ρ… Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ (Interface Pointer Identifiers – IPIDs), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Подобно администратору Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ, каТдая интСрфСйсная Π·Π°Π³Π»ΡƒΡˆΠΊΠ° содСрТит ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Однако ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ интСрфСйс Π±ΡƒΠ΄Π΅Ρ‚ интСрфСйсом ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π° Π½Π΅ просто IUnknown. На рис. 5.3 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ администратором Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ, интСрфСйсными Π·Π°Π³Π»ΡƒΡˆΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ интСрфСйсныС Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ Π·Π½Π°ΡŽΡ‚, ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ интСрфСйсный Ρ‚ΠΈΠΏ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ интСрфСйс.




Когда CoUnmarshalInterface Π΄Π΅ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΡ€ΡƒΠ΅Ρ‚ стандартно ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ ссылку, фактичСски эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ администратору замСститСлСй (proxy manager). Π­Ρ‚ΠΎΡ‚ администратор замСститСлСй дСйствуСт ΠΊΠ°ΠΊ копия ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° со стороны ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ администратору Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π°ΠΏΡ€ΠΈΠΎΡ€Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½ΠΈ ΠΎΠ± ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· интСрфСйсов БОМ. Однако администратор замСститСлСй Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° IUnknown. Π›ΡŽΠ±Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ AddRef ΠΈΠ»ΠΈ Release просто ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‚ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ счСтчик ссылок Π² администраторС замСститСлСй ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ с использованиСм ORPC. ПослСдний Release Π² администраторС замСститСлСй ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ, посылая Π² Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠΈ связи. Запросы QueryInterface Π² администраторС замСститСлСй ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСсколько ΠΈΠ½Π°Ρ‡Π΅. Подобно администратору Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ, администратор замСститСлСй Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π°ΠΏΡ€ΠΈΠΎΡ€Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± интСрфСйсах БОМ. ВмСсто этого администратор замСститСлСй Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ интСрфСйсныС замСститСли, Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΡ‚ интСрфСйс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ΄Π΅Ρ‚ запрос. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹ΠΉ Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² запросы ORPC. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ администратора Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ, администратор замСститСлСй являСтся нСпосрСдствСнно Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ для программистов, ΠΈ для обСспСчСния ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ интСрфСйсныС замСститСли Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ администратора замСститСлСй. Π­Ρ‚ΠΎ создаСт Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° иллюзию, Ρ‡Ρ‚ΠΎ всС интСрфСйсы Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ БОМ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. На рис. 5.4 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ администратором замСститСлСй, интСрфСйсными замСститСлями ΠΈ Π·Π°Π³Π»ΡƒΡˆΠΊΠΎΠΉ.




Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 5.4, Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ связываСтся с Π·Π°Π³Π»ΡƒΡˆΠΊΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠ°Π½Π°Π»ΠΎΠΌ. Канал – это поддСрТиваСмая БОМ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° Π²ΠΎΠΊΡ€ΡƒΠ³ слоя RPC Π½Π° этапС выполнСния. Канал выставляСт интСрфСйс IRpcChannelBuffer


[ uuid(D5F56B60-593B-101A-B569-08002B2DBF7A), local, object ]

interface IRpcChannelBuffer : IUnknown {

// programmatic representation of ORPC message

// ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ прСдставлСниС сообщСния ORPC

typedef struct tagRPCOLEMESSAGE {

void *reserved1;

unsigned long dataRepresentation;

// endian/ebcdic

// endian /Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎ-дСсятичный ΠΊΠΎΠ΄

// для ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ

void *Buffer;

// payload goes here

// полСзная Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ΄Π΅Ρ‚ сюда

ULONG cbBuffer;

// length of payload

// Π΄Π»ΠΈΠ½Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

ULONG iMethod;

// which method?

// Ρ‡Π΅ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄?

void *reserved2[5];

ULONG rpcFlags;

} RPCOLEMESSAGE;

// allocate a transmission buffer

// выдСляСм Π±ΡƒΡ„Π΅Ρ€ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ

HRESULT GetBuffer([inl RPCOLEMESSAGE *pMessage,

[in] REFIID riid);

// send an ORPC request and receive an ORPC response

// посылаСм ORPC-запрос ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ORPC-ΠΎΡ‚Π²Π΅Ρ‚

HRESULT SendReceive([in,out] RPCOLEMESSAGE *pMessage,

[out] ULONG *pStatus);

// deallocate a transmission buffer

// освобоТдаСм Π±ΡƒΡ„Π΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ

HRESULT FreeBuffer([in] RPCOLEMESSAGE *pMessage);

// get distance to destination for CoMarshalInterface

// ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ расстояниС Π΄ΠΎ адрСсата для CoMarshalInterface

HRESULT GetDestCtx([out] DWORD *pdwDestCtx,

[out] void **ppvDestCtx);

// check for explicit disconnects

// провСряСм явныС отсоСдинСния

HRESULT IsConnected(void);

}


Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹Π΅ замСститСли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ SendReceive этого интСрфСйса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°Π½Π°Π» ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ запросов ORPC ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ORPC.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹Π΅ замСститСли ΠΈ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ внутрипроцСссными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ БОМ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ администраторами соотвСтствСнно замСститСлСй ΠΈ Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ с использованиСм ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ БОМ-Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Π°Ρ Π·Π°Π³Π»ΡƒΡˆΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ интСрфСйс IRpcStubBuffer:


[ uuid(D5F56AFC-593B-101A-B569-08002B2DBF7A), local, object ]

interface IRpcStubBuffer : IUnknown {

// called to connect stub to object

// Π²Ρ‹Π·Π²Π°Π½ для соСдинСния Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ

HRESULT Connect([in] IUnknown *pUnkServer),

// called to inform stub to release object

// Π²Ρ‹Π·Π²Π°Π½ для информирования Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ ΠΎΠ± освобоТдСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

void Disconnect(void);

// called when ORPC request arrives

// вызываСтся, ΠΊΠΎΠ³Π΄Π° поступаСт запрос ORPC

HRESULT Invoke ([in] RPCOLEMESSAGE *pmsg,

[in] IRpcChannelBuffer *pChannel);

// used to support multiple itf types per stub

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² интСрфСйсов

// для ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ

IRpcStubBuffer *IsIIDSupported([in] REFIID riid);

// used to support multiple itf types per stub

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… интСрфСйсов

// для ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ

ULONG CountRefs(vold);

// used by ORPC debugger to find pointer to object

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ ORPC для поиска указатСля Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

HRESULT DebugServerQueryInterface(void **ppv);

// used by ORPC debugger to release pointer to object

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ ORPC для освобоТдСния указатСля Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

void DebugServerRelease(void *pv);

}


ΠœΠ΅Ρ‚ΠΎΠ΄ Invoke Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ БОМ, ΠΊΠΎΠ³Π΄Π° поступит запрос ORPC Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ [in]-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² RPCOLEMESSAGE, Π° ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π·Π°Π³Π»ΡƒΡˆΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ HRESULT ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ Π»ΡŽΠ±Ρ‹Π΅ [out]-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹ Π² Π±Π»ΠΎΠΊΠ΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ORPC.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹ΠΉ Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ интСрфСйс (интСрфСйсы), Π·Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ интСрфСйсу IRpcProxyBuffer:


[ uuid(D5F56A34-593B-101A-B569-08002B2DBF7A), local, object ]

interface IRpcProxyBuffer : IUnknown {

HRESULT Connect([in] IRpcChannelBuffer *pChannelBuffer);

void Disconnect(void);

}


Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ IRpcPΠ³oxΡƒBuffer Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ интСрфСйсом IUnknown интСрфСйсного замСститСля. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ интСрфСйсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выставляСт интСрфСйсный Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ администратору замСститСлСй свои ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ IUnknown. ИмСнно Π² рСализациях ΠΌΠ΅Ρ‚ΠΎΠ΄Π° этих Π΄Ρ€ΡƒΠ³ΠΈΡ… интСрфСйсов интСрфСйсный Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» для посылки запросов ORPC Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ интСрфСйсной Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ Invoke, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹Π΅ замСститСли ΠΈ интСрфСйсныС Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ динамичСски ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ CLSID ΠΊΠ°ΠΊ для замСститСля, Ρ‚Π°ΠΊ ΠΈ для Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ. Π’Π°ΠΊΡƒΡŽ Ρ€Π°Π·Π΄Π²ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ интСрфСйсным ΠΌΠ°Ρ€ΡˆΠ°Π»Π΅Ρ€ΠΎΠΌ (interface marshaler). ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса интСрфСйсного ΠΌΠ°Ρ€ΡˆΠ°Π»Π΅Ρ€Π° выставляСт интСрфСйс IPSFactoryBuffer: