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

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

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

[ uuid(0000001d-0000-0000-C000-000000000046),local,object ]

interface IMallocSpy : IUnknown {

ULONG PreAlloc([in] ULONG cbRequest);

void *PostAlloc([in] void *pActual);

void *PreFree([in] void *pRequest,[in] BOOL fSpyed);

void PostFree([in] BOOL fSpyed);

ULONG PreRealloc([in] void *pRequest,[in] ULONG cbRequest,

[out] void **ppNewRequest,[in] BOOL fSpyed);

void *PostRealloc([in] void *pActual, [in] BOOL fSpyed);

void *PreGetSize([in] void *pRequest, [in] BOOL fSpyed);

ULONG PostGetSize([in] ULONG cbActual,[in] BOOL fSpyed);

void *PreDidAlloc([in] void *pRequest, [in] BOOL fSpyed);

int PostDidAlloc([in] void *pRequest, [in] BOOL fSpyed, [in] int fActual);

void PreHeapMinimize(void);

void PostHeapMinimize(void);

}

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° IMalloc интСрфСйс IMallocSpy ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: ΠΎΠ΄ΠΈΠ½, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ БОМ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ памяти Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π°Ρ‡Π½Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ БОМ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ памяти Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Β«ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅Β» (premethod) прСдусмотрСнный ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ шпионский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŽ памяти. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ «постмСтодС» (postmethod) шпионский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ распрСдСлитСлСм памяти Π·Π°Π΄Π°Ρ‡ΠΈ. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡˆΠΏΠΈΠΎΠ½ΡΠΊΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΡƒ памяти ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π’ БОМ имССтся API-функция для рСгистрации шпиона распрСдСлСния памяти (Malloc spy) всСго процСсса:

HRESULT CoRegisterMallocSpy([in] IMallocSpy *pms);

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ процСссС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ зарСгистрирован Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ шпион распрСдСлСния памяти (CoRegisterMallocSpy Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ CO_E_OBJISREG Π² Ρ‚ΠΎΠΌ случаС, Ссли ΡƒΠΆΠ΅ зарСгистрирован Π΄Ρ€ΡƒΠ³ΠΎΠΉ шпион). Для удалСния шпиона распрСдСлСния Π² БОМ прСдусмотрСна API-функция CoRevokeMallocSpy:

HRESULT CoRevokeMallocSpy(void);

БОМ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ полномочия шпиона распрСдСлСния Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ освобоТдСна ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ шпионом.


ΠœΠ°ΡΡΠΈΠ²Ρ‹

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ указатСлями Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Π΅ экзСмпляры, Π° Π½Π΅ Π½Π° массивы. Для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ массива Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис Π‘ для массивов ΠΈ/ΠΈΠ»ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ IDL для прСдставлСния Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ размСрности массива. ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ массивов – Π·Π°Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Π²ΠΎ врСмя компиляции:

HRESULT Method1([in] short rgs[8]);

Π’Π°ΠΊΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ называСтся массивом постоянной Π΄Π»ΠΈΠ½Ρ‹ (fixed array) ΠΈ являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым для выраТСния Π½Π° языкС IDL ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ – Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ прСдставлСниСм Π²ΠΎ врСмя выполнСния. Для Ρ‚Π°ΠΊΠΎΠ³ΠΎ массива интСрфСйсный Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŒ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ 16 Π±Π°ΠΉΡ‚ (8 * sizeof (short)) Π² сообщСнии ORPC-запроса, Π° Π·Π°Ρ‚Π΅ΠΌ скопируСт Π² сообщСниС всС восСмь элСмСнтов. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСрвСр ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ORPC-запрос, интСрфСйсная Π·Π°Π³Π»ΡƒΡˆΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ нСпосрСдствСнно ΠΈΠ· ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 7.2.



ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива являСтся постоянным ΠΈ всС содСрТимоС массива ΡƒΠΆΠ΅ содСрТится Π² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅, интСрфСйсная Π·Π°Π³Π»ΡƒΡˆΠΊΠ° достаточно Ρ€Π°Π·ΡƒΠΌΠ½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€Π° Π² качСствС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Волько Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Ссли Π²ΠΎ всСх случаях СдинствСнно Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½ΠΎΠΉ массива являСтся 8. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»Π°Ρ‚ΡŒ любой Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Сю массив ΠΈΠ· ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл (shorts), ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ этот массив состоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· восьми элСмСнтов:

void f(IFoo *pFoo)

{

short rgs[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };

pFoo->Method1(rgs);

}

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ прСдсказаниС подходящСй Π΄Π»ΠΈΠ½Ρ‹ массива Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ слишком малая Π΄Π»ΠΈΠ½Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ нСдостаточно элСмСнтов, Π° слишком большая Π΄Π»ΠΈΠ½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ сообщСния. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли массив состоит ΠΈΠ· слоТных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³ элСмСнтов Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ фактичСского Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ вСсьма Π΄ΠΎΡ€ΠΎΠ³ΠΎ ΠΈ/ΠΈΠ»ΠΈ привСсти ΠΊ ошибкам ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³Π°. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, массивы постоянной Π΄Π»ΠΈΠ½Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ массива Π½Π΅ измСняСтся ΠΈ извСстСн Π²ΠΎ врСмя формирования интСрфСйса.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ массивов Π²ΠΎ врСмя выполнСния, IDL (ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ сСтСвой ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» NDR) Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ массива Π½Π° этапС выполнСния. ΠœΠ°ΡΡΠΈΠ²Ρ‹ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ совмСстимыми (conformant). ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ допустимый индСкс совмСстимого массива ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Π²ΠΎ врСмя выполнСния, Π»ΠΈΠ±ΠΎ Π²ΠΎ врСмя компиляции, Π° Π΄Π»ΠΈΠ½Π°, называСмая соотвСтствиСм (conformance) массива, пСрСдаСтся Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ‡Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ элСмСнты, ΠΊΠ°ΠΊ это ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 7.3. Как ΠΈ Π² случаС массива постоянной Π΄Π»ΠΈΠ½Ρ‹, совмСстимыС массивы ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° нСпосрСдствСнно ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ копирования, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌ сообщСнии всСгда присутствуСт всС содСрТимоС массива.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‚ΡŒ соотвСтствиС массива, IDL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [size_is]:

HRESULT Method2([in] long cElems,

[in, size_is(cElems)] short rgs[*]);

ΠΈΠ»ΠΈ

HRESULT Method3([in] long cElems,

[in, size_is (cElems)] short rgs[]);

ΠΈΠ»ΠΈ

HRESULT Method4([in] long cElems,

[in, size_is(cElems)] short *rgs);



ВсС эти Ρ‚ΠΈΠΏΡ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ эквивалСнтными Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. Π›ΡŽΠ±ΠΎΠΉ ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΄Π°Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

void f(IFoo *pFoo)

{

short rgs[] = { 1, 2, 3, 4, 5, 6, 7, 8 };

pFoo->Method2(8, rgs);

}

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ [size_is] ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ способом, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ арифмСтичСскиС, логичСскиС ΠΈ условныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ IDL-ΠΊΠΎΠ΄ являСтся допустимым ΠΈ достаточно простым для понимания:

HRESULT Method5([in] long arg1,

[in] long arg2,

[in] long arg3,

[in, size_is(arg1 ? (arg3+1) : (arg1 & arg2))] short *rgs);

Π’Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языковыС конструкции, способныС Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты (Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ++ ΠΈ –), Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹ Π² выраТСниях Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° [size_is].

Если Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [size_is] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для описания совмСстимого массива, Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ структуры, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты этой структуры:

typedef struct tagCOUNTED_SHORTS {

long cElems;

[size_is(cElems)] short rgs[];

} COUNTED_SHORTS;

HRESULT Method6([in] COUNTED_SHORTS *pcs);

ΠΈΠ· Ρ‡Π΅Π³ΠΎ слСдуСт, Ρ‡Ρ‚ΠΎ Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ написан ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

void SendFiveShorts (IFoo *pFoo)

{

char buffer [sizeof (COUNTED_SHORTS) + 4 * sizeof (short)];

COUNTED_SHORTS& rcs = *reinterpret_cast<COUNTED_SHORTS*>(buffer);

rcs.cElems = 5;

rcs.rgs[0] = 0;

rcs.rgs[1] = 1;

rcs.rgs[2] = 2;

rcs.rgs[3] = 3;

rcs.rgs[4] = 4;

pFoo->Method6(&rcs);

}

IDL Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [max_is], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся стилистичСской Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠ΅ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° [size_is]. Атрибут [size_is] ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ число элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ массив; Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [max_is] ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ допустимый индСкс Π² массивС (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ мСньшС числа элСмСнтов, содСрТащихся Π² массивС). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π²Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ описания эквивалСнтны Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ:

HRESULT Method7([in, size_is(10)] short *rgs);

HRESULT Method8([in, max_is(9)] short *rgs);

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ хотя Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… [size_is] ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ константы, ΠΊΠ°ΠΊ это ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивным прСдставляСтся использованиС массива постоянной Π΄Π»ΠΈΠ½Ρ‹. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ совмСстимый массив, Ρ‚ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ соотвСтствия Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° статична ΠΈ извСстна Π½Π° этапС компиляции ΠΊΠ°ΠΊ интСрфСйсному Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅Π»ΡŽ, Ρ‚Π°ΠΊ ΠΈ интСрфСйсной Π·Π°Π³Π»ΡƒΡˆΠΊΠ΅.

Если Π±Ρ‹ содСрТимоС массивов ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎ совмСстимый массив Π±Ρ‹Π» Π±Ρ‹ достаточСн ΠΏΠΎΡ‡Ρ‚ΠΈ для Π»ΡŽΠ±Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ. Однако Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ пустой массив ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ значСниями. Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, совмСстимыС массивы ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

HRESULT Method9([in] long cMax, [out, size_is(cMax)] short *rgs);

ΠΈΠ· Ρ‡Π΅Π³ΠΎ слСдуСт Ρ‚Π°ΠΊΠΎΠ΅ использованиС со стороны Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

void f(IFoo *pFoo)

{

short rgs[100];

pFoo->Method9(100, rgs);

}

Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ рСализация со стороны сСрвСра:

HRESULT CFoo::Method9(long cMax, short *rgs)

{

for (long n = 0; n < cMax; n++)

rgs[n] = n * n;

return S_OK;

}

Но Ρ‡Ρ‚ΠΎ, Ссли рСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ вСсь массив допустимыми элСмСнтами? Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°, Π΄Π°ΠΆΠ΅ Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ cMax/2 элСмСнтов массива, Π·Π°Π³Π»ΡƒΡˆΠΊΠ° со стороны сСрвСра, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, пСрСдаст вСсь массив ΠΈΠ· cMax элСмСнтов. Ясно, Ρ‡Ρ‚ΠΎ это нСэффСктивно, ΠΈ для исправлСния этого полоТСния Π² IDL ΠΈ NDR имССтся Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Ρ‚ΠΈΠΏ массивов, β€“ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ массив (varying array).

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ массив – это массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ мСньшС допустимых элСмСнтов, Ρ‡Π΅ΠΌ позволяСт Π΅Π³ΠΎ фактичСская Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ. Π’Π½Π΅ зависимости ΠΎΡ‚ фактичСской Π΄Π»ΠΈΠ½Ρ‹ массива Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ΅ подмноТСство содСрТимого ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ массива. Для задания подмноТСства элСмСнтов, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅, IDL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [length_is]. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° [size_is], ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρƒ массива, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [length_is] описываСт фактичСскоС содСрТимоС массива. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° IDL:

HRESULT Method10([in] long cActual, [in, length_is(cActual)] short rgs[1024]);