Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
IX ΠΈ IY — ΡΡΠΎ ΡΠΈΡΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². Π§ΠΈΡΡΠΎΠ°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ (pure abstract base class) — ΡΡΠΎ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ (pure virtual functions). Π§ΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ — ΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, «ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½Π°Ρ =0 — Π·Π½Π°ΠΊΠΎΠΌ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΡΠΈΡΡΠΎΡΡ (pure specifier). Π§ΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
- ΠΠ°Π΄Π°Π½ΠΈΠ΅ № 1 Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° COM
- ΠΠ°Π΄Π°Π½ΠΈΠ΅ № 1Π QueryInterface
- ΠΠ°Π΄Π°Π½ΠΈΠ΅ № 1B ΠΠΎΠ΄ΡΡΠ΅Ρ ΡΡΡΠ»ΠΎΠΊ
ΠΠ°Π΄Π°Π½ΠΈΠ΅ № 1 Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° COM
Π¦Π΅Π»Ρ ΡΠ°Π±ΠΎΡΡ:
Π Π°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΠ΄ Π½Π° Π‘++, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π‘ΠΠ Π±Π΅Π· Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ:
ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ ΡΠ΅ΡΠ΅Π· Π΄Π²Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IX ΠΈIY, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ COM ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΠΊΠ°ΠΊ ΡΠΈΡΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Π‘++;
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ main;
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠΌ Π‘Π, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΊΠ°ΠΊ IX ΡΠ°ΠΊ ΠΈ IY;
ΠΊΠ»Π°ΡΡ Π‘Π ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ ΠΎΠ±ΠΎΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² (ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅);
ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° (Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° new ΠΈ delete), Π΄Π°Π»Π΅Π΅ ΠΎΠ½ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π°Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌ Π½Π° ΠΊΠ»Π°ΡΡΡ Π‘++;
Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² IX ΠΈ IY;
ΡΠ΄Π°Π»ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ;
Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΊΠ°ΠΊ ΠΊΠ»Π°ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° OBJBASE. H
#define interface struct
ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
virtual void _stdcall … .
Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ:
Π Π‘ΠΠ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ — ΡΡΠΎ Π²ΡΠ΅. ΠΠ»Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². ΠΠ»ΠΈΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ Π‘ΠΠ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° Π‘ΠΠ, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ — Π²Π°ΠΆΠ½Π°Ρ ΡΠ°ΡΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ Π΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ Π΄Π΅ΡΠ°Π»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ².
Π£ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ — Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ Π΄Π΅ΡΠ°Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΡΠ΅ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π±Π΅Π· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅Ρ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π΄ΡΡΠ³ΠΈΠΌ; Π΅ΡΠ»ΠΈ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ΅ ΠΆΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΡΡΠΎ ΠΈ ΡΡΠ°ΡΡΠΉ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ. ΠΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ. ΠΠΎΠΊΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ ΠΈ ΠΈΡΡΠ΅Π·Π°ΡΡ
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠΎΠ΄, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ CA ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ IX ΠΈ IY Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π²ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ².
class IX // ΠΠ΅ΡΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
{
public:
virtual void Fx1() = 0;
virtual void Fx2() = 0;
};
class IY // ΠΡΠΎΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
{
public:
virtual void Fy1() = 0;
virtual void Fy2() = 0;
};
class CA: public IX, public IY // ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
{
public:
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° IX
virtual void Fx1() { cout << «Fx1» << endl; }
virtual void Fx2() { cout << «Fx2» << endl; }
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° IY
virtual void Fy1() { cout << «Fy1» << endl; }
virtual void Fy2() { cout << «Fy2» << endl; }
};
IX ΠΈ IY — ΡΡΠΎ ΡΠΈΡΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². Π§ΠΈΡΡΠΎΠ°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ (pure abstract base class) — ΡΡΠΎ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ (pure virtual functions). Π§ΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ — ΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, «ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½Π°Ρ =0 — Π·Π½Π°ΠΊΠΎΠΌ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΡΠΈΡΡΠΎΡΡ (pure specifier). Π§ΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡΠ² ΠΊΠ»Π°ΡΡΠ°Ρ , Π² ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ. ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°, ΡΡΠ½ΠΊΡΠΈΠΈ IX: Fx1, IX: Fx2, IY: Fy1 ΠΈ IY: Fy2 ΡΠΎΠ»ΡΠΊΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΡΡΡΡΡ. Π Π΅Π°Π»ΠΈΠ·ΡΡΡΡΡ ΠΆΠ΅ ΠΎΠ½ΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ ΠΊΠΎΠ΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ CA Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄Π²Π° ΡΠΈΡΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠ° — IX ΠΈ IY — ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΡ ΡΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ IX ΠΈ IY, CA ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠ»Π°ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΠ»Π°ΡΡ Π‘++ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ. Π΅. ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ.
Π’Π΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
#include «stdafx.h»
#include «iostream.h»
#include «objbase.h» // ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
#include «conio.h»
void trace (const char* pMsg) { cout << pMsg << endl; }
// ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ
interface IX
{
virtual void __stdcall Fx1() = 0;
virtual void __stdcall Fx2() = 0;
};
interface IY
{
virtual void __stdcall Fy1() = 0;
virtual void __stdcall Fy2() = 0;
};
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°
class CA: public IX,
public IY
{
public:
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IX
virtual void __stdcall Fx1() { cout << «CA:Fx1» << endl; }
virtual void __stdcall Fx2() { cout << «CA:Fx2» << endl; }
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IY
virtual void __stdcall Fy1() { cout << «CA:Fy1» << endl; }
virtual void __stdcall Fy2() { cout << «CA:Fy2» << endl; }
};
// ΠΠ»ΠΈΠ΅Π½Ρ
int main ()
{
trace («Client: Sozdanie ekzemplyra komponenta»);
CA* pA = new CA;
// ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ IX
IX* pIX = pA;
trace («Client: Ispol’zovanie interface IX»);
pIX->Fx1();
pIX->Fx2();
// ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ IY
IY* pIY = pA;
trace («Client: Ispol’zovanie interface IY»);
pIY->Fy1();
pIY->Fy2();
trace («Client: Delete komponent»);
delete pA;
getch ();
return 0; }
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
ΠΡΠ²ΠΎΠ΄:
Π Π΄Π°Π½Π½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΠΎΠ²Π°Π»ΠΈ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π‘ΠΠ Π±Π΅Π· Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ COM ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΠΊΠ°ΠΊ ΡΠΈΡΡΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Π‘++, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ main.
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 2 № 1Π QueryInterface
Π¦Π΅Π»Ρ ΡΠ°Π±ΠΎΡΡ:
ΠΠ±ΡΡΠ²ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ IX, IY, IZ. ΠΠ±ΡΡΠ²ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IUnknown.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. ΠΠ»Π°ΡΡ Π‘Π ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ IX ΠΈ IY. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ QueryInterface ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π²ΡΡΠ΅ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ. Π€ΡΠ½ΠΊΡΠΈΡ CreateInstance ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ»Π°ΡΡΠ° CA. ΠΠ»ΠΈΠ΅Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΅Π΅, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π‘Π, ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° IUnknown ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. ΠΠΎΡΠ»Π΅ CreateInstance ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ IID Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². (ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ IID Π΄Π»Ρ IUnknown ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡ Ρ UUID. LIB).
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΠΎΠ»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ main. ΠΠ»ΠΈΠ΅Π½Ρ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ CreateInstance. CreateInstance Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IUnknown ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. ΠΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ QueryInterface Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IUnknown ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. ΠΠ½ΠΎΠ»ΠΎΠ³ΠΈΡΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΈ IY. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ-ΡΠ»Π΅Π½Π°ΠΌ. ΠΠ°ΠΏΡΠΎΡΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IZ. QueryInterface Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π‘Π Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ IZ. ΠΠ°Π»Π΅Π΅ ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IY ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX, pIX. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ IY, ΡΡΠΎΡ Π·Π°ΠΏΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΡΡΠΏΠ΅ΡΠ½ΡΠΌ, ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IY ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ. ΠΠ°ΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IUnknown ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° IY. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ COM Π½Π°ΡΠ»Π΅Π΄ΡΡΡ IUnknown, ΡΡΠΎΡ Π·Π°ΠΏΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΡΠΌ, ΠΏΡΠΈΡΠ΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Ρ Ρ ΠΏΠ΅ΡΠ²ΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ. QueryInterface Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΊ IUnknown.
Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ:
Π COM ΠΊΠ»ΠΈΠ΅Π½Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°
IUnknown, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ UNKWN. H:
Interface IUnknown
{
virtual HREZULT —stdcall QueryInterface (const IID&iid,
void * * ppv) = 0 ;
virtual ULONG —stdcall Addref () = 0 ;
virtual ULONG —stdcall Release () = 0 ;
};
Π€ΡΠ½ΠΊΡΠΈΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ QueryInterface ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π£ ΡΡΠ½ΠΊΡΠΈΠΈ QueryInterface Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ — ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ — Π°Π΄ΡΠ΅Ρ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ QueryInterface ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΡΠΊΠΎΠΌΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
QueryInterface Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ HREZULT — 32-ΡΠ°Π·ΡΡΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°.
QueryInterface ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ Π»ΠΈΠ±ΠΎ S_OK, Π»ΠΈΠ±ΠΎ E_NOINTERFACE. ΠΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΡΠΌΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ QueryInterface Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΡΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°ΠΌΠΈ; Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡΡ SUCCEEDED ΠΈΠ»ΠΈ FAILED.
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° IUnknown
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° IUnknown ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, CreateInstance ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° IUnknown:
IUnknown * CreateInstance ()
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ CreateInstance:
IUnknown * pI = static_cast (new CA) ;
PI->Addref () ;
Return pI ;
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ QueryInterface.
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° IUnknown, pI. Π§ΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ QueryInterface, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π΅ΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΡΠ»ΠΈ QueryInterface ΠΎΡΡΠ°Π±ΠΎΡΠ°Π»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ:
void foo (IUnknown* pI)
{
// ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
IX* pIX=NULL;
// ΠΠ°ΠΏΡΠΎΡΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
HREZULT hr = pI-> QueryInterface (IID_IX, (void**)&pIX) ;
// ΠΡΠΎΠ²Π΅ΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°
if (SUCCEEDED (hr))
{
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
pIXFx () ;
}
}
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ QueryInterface.
ΠΠ°ΠΏΠΈΡΠ΅ΠΌ QueryInterface Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠΎΠΌ CA:
Interface IX: IUnknown { /*…*/ } ;
Interface IY: IUnknown { /*…*/ } ;
Class CA: public IX, public IY { /*…*/ } ;
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ QueryInterface Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠ΄Π°.
HREZULT —stdcall CA: QueryInterface (const IID&iid, void * * ppv);
{
if (iid ==IID_IUnknown)
{
// ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IUnknown
*ppv = static_cast (this) ;
}
else if (iid ==IID_IX)
{
// ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
*ppv = static_cast (this) ;
}
else if (iid ==IID_IY)
{
// ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IY
*ppv = static_cast (this) ;
}
else
{
// ΠΡ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
// Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π² NULL.
*ppv = NULL ;
return E_NOINTERFACE ;
}
static_cast< IUnknown*>(*ppv)->AddRef () ;
return S_OK ;
}
Π’Π΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
#include «stdafx.h»
#include «iostream.h»
#include «objbase.h»
#include «conio.h»
void trace (const char* msg) { cout << msg << endl; }
// ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ
interface IX: IUnknown
{
virtual void __stdcall Fx () = 0;
};
interface IY: IUnknown
{
virtual void __stdcall Fy () = 0;
};
interface IZ: IUnknown
{
virtual void __stdcall Fz () = 0;
};
// ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ GUID
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
// ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
class CA: public IX, public IY
{
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ IUnknown
virtual HRESULT __stdcall QueryInterface (const IID& iid, void** ppv);
virtual ULONG __stdcall AddRef () { return 0; }
virtual ULONG __stdcall Release () { return 0; }
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IX
virtual void __stdcall Fx () { cout << «Fx» << endl; }
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IY
virtual void __stdcall Fy () { cout << «Fy» << endl; }
};
HRESULT __stdcall CA: QueryInterface (const IID& iid, void** ppv)
{
if (iid == IID_IUnknown)
{
trace («QueryInterface: Vernyt' ykazatel' na IUnknown»);
*ppv = static_cast (this);
}
else if (iid == IID_IX)
{
trace («QueryInterface: Vernyt' ykazatel' na IX»);
*ppv = static_cast (this);
}
else if (iid == IID_IY)
{
trace («QueryInterface: Vernyt' ykazatel' na IY»);
*ppv = static_cast (this);
}
else
{
trace («QueryInterface: Interface No!»);
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast (*ppv)->AddRef ();
return S_OK;
}
// Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ
IUnknown* CreateInstance ()
{
IUnknown* pI = static_cast (new CA);
pI->AddRef ();
return pI;
}
// IID
// {32bb8320-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IX =
{0×32bb8320, 0xb41b, 0×11cf,
{0xa6, 0xbb, 0×0, 0×80, 0xc7, 0xb2, 0xd6, 0×82}};
// {32bb8321-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IY =
{0×32bb8321, 0xb41b, 0×11cf,
{0xa6, 0xbb, 0×0, 0×80, 0xc7, 0xb2, 0xd6, 0×82}};
// {32bb8322-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IZ =
{0×32bb8322, 0xb41b, 0×11cf,
{0xa6, 0xbb, 0×0, 0×80, 0xc7, 0xb2, 0xd6, 0×82}};
// ΠΠ»ΠΈΠ΅Π½Ρ
int main ()
{
HRESULT hr;
trace («Client: Polychit' ykazatel' na IUnknown»);
IUnknown* pIUnknown = CreateInstance ();
trace («Client: Polychit' ykazatel' na IX»);
IX* pIX = NULL;
hr = pIUnknown->QueryInterface (IID_IX, (void**)&pIX);
if (SUCCEEDED (hr))
{
trace («Client: IX polychen»);
pIX->Fx (); // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
}
trace («Client: Polychit' ykazatel na IY»);
IY* pIY = NULL;
hr = pIUnknown->QueryInterface (IID_IY, (void**)&pIY);
if (SUCCEEDED (hr))
{
trace («Client: IY polychen»);
pIY->Fy (); // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IY
}
trace («Client: Zaprosit' nepodderjivaemuy interface»);
IZ* pIZ = NULL;
hr = pIUnknown->QueryInterface (IID_IZ, (void**)&pIZ);
if (SUCCEEDED (hr))
{
trace («Client: Interface IZ polychen»);
pIZ->Fz ();
}
else
{
trace («Client: No Interface IZ»);
}
trace («Client: Polychit' Interface IY cherez Interface IX»);
IY* pIYfromIX = NULL;
hr = pIX->QueryInterface (IID_IY, (void**)&pIYfromIX);
if (SUCCEEDED (hr))
{
trace («Client: IY polychen»);
pIYfromIX->Fy ();
}
trace («Client: Polechit' Interface IUnknown cherez IY»);
IUnknown* pIUnknownFromIY = NULL;
hr = pIY->QueryInterface (IID_IUnknown, (void**)&pIUnknownFromIY);
if (SUCCEEDED (hr))
{
cout << «Sovpadaut li ykazateli na IUnknown? «;
if (pIUnknownFromIY == pIUnknown)
{
cout << «Yes, pIUnknownFromIY == pIUnknown» << endl;
}
else
{
cout << «No, pIUnknownFromIY ≠ pIUnknown» << endl;
}
}
// Π£Π΄Π°Π»ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
delete pIUnknown;
getch ();
return 0;
}
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
ΠΡΠ²ΠΎΠ΄:
Π Π΄Π°Π½Π½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΎΠ±ΡΡΠ²ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ IX, IY, IZ, ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IUnknown.
Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ. ΠΠ»Π°ΡΡ Π‘Π ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ IX ΠΈ IY. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ QueryInterface. Π€ΡΠ½ΠΊΡΠΈΡ CreateInstance, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ»Π°ΡΡΠ° CA. ΠΠ»ΠΈΠ΅Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΅Π΅, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π‘Π, ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° IUnknown ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°.
ΠΠ°Π΄Π°Π½ΠΈΠ΅ № 1B ΠΠΎΠ΄ΡΡΠ΅Ρ ΡΡΡΠ»ΠΎΠΊ
Π¦Π΅Π»Ρ ΡΠ°Π±ΠΎΡΡ:
ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΊ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈΠ· Π»Π°Π±ΠΎΡΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ № 1Π ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΡΠ»ΠΎΠΊ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π²ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² IUnknown — AddRef ΠΈ Release. ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Win32 InterlockedIncrement ΠΈ InterlockedDecrement. Π€ΡΠ½ΠΊΡΠΈΡ AddRef Π²ΡΠ·ΡΠ²Π°ΡΡ CreateInstance ΠΈ QueryInterface Π΄Π»Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ. ΠΡΠ·ΠΎΠ²Ρ Release Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠΈΡΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ.
ΠΠΈΠΊΠ²ΠΈΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ°.
Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ:
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΄Π°Π»ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈΠ»ΠΈ ΡΡΠΎ ΠΌΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ Ρ Π½ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΡ ΡΠΎΡΠ½ΠΎ Π·Π½Π°Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΈ Π·Π½Π°Π΅ΠΌ (ΠΎΠ±ΡΡΠ½ΠΎ), ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅ΠΌ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ ΡΠΆΠ΅ ΡΡΠ½ΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ Π·Π½Π°ΡΡ, ΡΡΠΎ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²ΠΎΠΎΠ±ΡΠ΅. ΠΠΎΡΡΠΎΠΌΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ — ΠΈ ΠΏΡΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ°ΠΌ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΡΠ΅ΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ.
ΠΠΌΠ΅Π½Π½ΠΎ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠΉ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΈ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΅ΡΠ΅ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π° IUnknown — AddRef ΠΈ Release.
ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IUnknown:
interface IUnknown
{
virtual HRESULT __stdcall QueryInterface (const IID& iid, void** ppv) = 0;
virtual ULONG __stdcall AddRef () = 0;
virtual ULONG __stdcall Release () = 0;
};
AddRef ΠΈ Release ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΡΡ, ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΡΠ»ΠΎΠΊ (reference counting).
ΠΠΎΠ΄ΡΡΠ΅Ρ ΡΡΡΠ»ΠΎΠΊ — ΠΏΡΠΎΡΡΠΎΠΉ ΠΈ Π±ΡΡΡΡΡΠΉ ΡΠΏΠΎΡΠΎΠ±, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ ΡΠ°ΠΌΠΈΠΌ ΡΠ΄Π°Π»ΡΡΡ ΡΠ΅Π±Ρ. ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π‘ΠΠ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ. ΠΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ. ΠΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ. ΠΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π΄ΠΎΡ ΠΎΠ΄ΠΈΡ Π΄ΠΎ Π½ΡΠ»Ρ, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΠ΅Π±Ρ ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ»ΠΈΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΠΈΠΉΡΡ Ρ Π½Π΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠ°ΠΊ ΠΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π΄ΠΎΠ³Π°Π΄Π°Π»ΠΈΡΡ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ΅ΡΡΠΈΠΊ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ AddRef, Π° ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ — Π²ΡΠ·ΠΎΠ²ΠΎΠΌ Release.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠΎΠΌ ΡΡΡΠ»ΠΎΠΊ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°ΡΡ Π»ΠΈΡΡ ΡΡΠΈ ΠΏΡΠΎΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π°:
1. ΠΡΠ·ΡΠ²Π°ΠΉΡΠ΅ AddRef ΠΏΠ΅ΡΠ΅Π΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ. Π€ΡΠ½ΠΊΡΠΈΠΈ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΏΠ΅ΡΠ΅Π΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ Π²ΡΠ΅Π³Π΄Π°
Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ AddRef Π΄Π»Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ. ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ QueryInterface ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ CreateInstance. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΠ°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ AddRef Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ (ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ) ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
2. ΠΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅ Release. ΠΠΎΠ³Π΄Π° ΠΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΡΠ°Π±ΠΎΡΡ Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ Release.
3. ΠΡΠ·ΡΠ²Π°ΠΉΡΠ΅ AddRef ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ. ΠΠΎΠ³Π΄Π° Π±Ρ ΠΡ Π½ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π»ΠΈ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄ΡΡΠ³ΠΎΠΌΡ, Π²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅ AddRef. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ: ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²Π°Ρ ΡΡΡΠ»ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX. ΠΡ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ AddRef, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π·Π° Π½Π°Ρ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ CreateInstance ΠΈ QueryInterface. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Release ΠΊΠ°ΠΊ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IUnknown, Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ CreateInstance, ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IX, Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ QueryInterface.
// Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
IUnknown* pIUnknown = CreateInstance ();
// ΠΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
IX* pIX = NULL;
HRESULT hr = pIUnknown->QueryInterface (IID_IX, (void**)&pIX);
if (SUCCEEDED (hr))
{
pIX->Fx (); // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
pIX->Release (); // ΠΠ°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ IX
}
pIUnknown->Release (); // ΠΠ°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ Iunknown
Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ IUnknown ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π°
QueryInterface, ΡΠ°ΠΊ ΡΡΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ ΡΠ°Π½ΡΡΠ΅.
// Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
IUnknown* pIUnknown = CreateInstance ();
// ΠΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
IX* pIX = NULL;
HRESULT hr = pIUnknown->QueryInterface (IID_IX, (void**)&pIX);
// ΠΠ°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ IUnknown
pIUnknown->Release ();
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ IX, Π΅ΡΠ»ΠΈ ΠΎΠ½ Π±ΡΠ» ΠΏΠΎΠ»ΡΡΠ΅Π½ ΡΡΠΏΠ΅ΡΠ½ΠΎ
if (SUCCEEDED (hr))
{
pIX->Fx (); // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
pIX->Release (); // ΠΠ°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ IX
}
ΠΠ΅Π³ΠΊΠΎ Π·Π°Π±ΡΡΡ, ΡΡΠΎ Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΡ ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π½Π°Π΄ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ Π΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π΄Π°Π»Π΅Π΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ ΠΊΠΎΠ΄Π° Π΄Π΅Π»Π°Π΅ΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Π° ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX. Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΊΠΎΠΏΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΎ ΡΠ΅ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 3.
// Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
IUnknown* pIUnknown = CreateInstance ();
IX* pIX = NULL;
HRESULT hr = pIUnknown->QueryInterface (IID_IX, (void**)&pIX);
pIUnknown->Release ();
if (SUCCEEDED (hr))
{
pIX->Fx (); // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
IX* pIX2 = pIX; // Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΏΠΈΡ pIX
pIX2->AddRef (); // Π£Π²Π΅Π»ΠΈΡΠΈΡΡ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ
pIX2->Fx (); // Π§ΡΠΎ-ΡΠΎ Π΄Π΅Π»Π°ΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ pIX2
pIX2->Release (); // ΠΠ°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ pIX2
pIX->Release (); // ΠΠ°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ pIX
}
ΠΠ»ΠΈΠ΅Π½Ρ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ
QueryInterface. QueryInterface Π²ΡΠ·ΡΠ²Π°Π΅Ρ AddRef Π΄Π»Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, ΠΎΠ½ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Release. ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡΡΠ°Π΅ΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΠΎΠΆΠΈΠ΄Π°Ρ, ΠΏΠΎΠΊΠ° ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ Π½Π΅ ΡΡΠ°Π½Π΅Ρ ΡΠ°Π²Π΅Π½ 0. ΠΠΎΠ³Π΄Π° ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½ΡΠ»Π΅ΠΌ, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ°ΠΌ ΡΠ΅Π±Ρ ΡΠ΄Π°Π»ΡΠ΅Ρ.
Π’Π΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
#include «stdafx.h»
#include «iostream.h»
#include «objbase.h»
#include «conio.h»
void trace (const char* msg) { cout << msg << endl; }
// ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ GUID
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
// ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ
interface IX: IUnknown
{
virtual void __stdcall Fx () = 0;
};
interface IY: IUnknown
{
virtual void __stdcall Fy () = 0;
};
interface IZ: IUnknown
{
virtual void __stdcall Fz () = 0;
};
// ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
class CA: public IX, public IY
{
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ IUnknown
virtual HRESULT __stdcall QueryInterface (const IID& iid, void** ppv);
virtual ULONG __stdcall AddRef ();
virtual ULONG __stdcall Release ();
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IX
virtual void __stdcall Fx () { cout << «Fx» << endl; }
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IY
virtual void __stdcall Fy () { cout << «Fy» << endl; }
public:
// ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
CA (): m_cRef (0) {}
// ΠΠ΅ΡΡΡΡΠΊΡΠΎΡ
~CA () { trace («CA: Likvidirovat' seby»); }
private:
long m_cRef;
};
HRESULT __stdcall CA: QueryInterface (const IID& iid, void** ppv)
{
if (iid == IID_IUnknown)
{
trace («CA QI: Vozvratit' ykazateel na IUnknown»);
*ppv = static_cast (this);
}
else if (iid == IID_IX)
{
trace («CA QI: Vozvratit' ykazateel na IX»);
*ppv = static_cast (this);
}
else if (iid == IID_IY)
{
trace («CA QI: Vozvratit' ykazateel na IY»);
*ppv = static_cast (this);
}
else
{
trace («CA QI: Interface No!»);
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast (*ppv)->AddRef ();
return S_OK;
}
ULONG __stdcall CA: AddRef ()
{
cout << «CA: AddRef = «<< m_cRef+1 << endl;
return InterlockedIncrement (&m_cRef);
}
ULONG __stdcall CA: Release ()
{
cout << «CA: Release = «<< m_cRef-1 << endl;
if (InterlockedDecrement (&m_cRef) == 0)
{
delete this;
return 0;
}
return m_cRef;
}
// Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ
IUnknown* CreateInstance ()
{
IUnknown* pI = static_cast (new CA);
pI->AddRef ();
return pI;
}
// IID
// {32bb8320-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IX =
{0×32bb8320, 0xb41b, 0×11cf,
{0xa6, 0xbb, 0×0, 0×80, 0xc7, 0xb2, 0xd6, 0×82}};
// {32bb8321-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IY =
{0×32bb8321, 0xb41b, 0×11cf,
{0xa6, 0xbb, 0×0, 0×80, 0xc7, 0xb2, 0xd6, 0×82}};
// {32bb8322-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IZ =
{0×32bb8322, 0xb41b, 0×11cf,
{0xa6, 0xbb, 0×0, 0×80, 0xc7, 0xb2, 0xd6, 0×82}};
// ΠΠ»ΠΈΠ΅Π½Ρ
int main ()
{
HRESULT hr;
trace («Client: Polychit' ykazatel IUnknown»);
IUnknown* pIUnknown = CreateInstance ();
trace («Client: Polychit' Interface IX»);
IX* pIX = NULL;
hr = pIUnknown->QueryInterface (IID_IX, (void**)&pIX);
if (SUCCEEDED (hr))
{
trace («Client: IX polychen»);
pIX->Fx (); // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IX
pIX->Release ();
}
trace («Client: Polychit' Interface IY»);
IY* pIY = NULL;
hr = pIUnknown->QueryInterface (IID_IY, (void**)&pIY);
if (SUCCEEDED (hr))
{
trace («Client: IY polychen»);
pIY->Fy (); // ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IY
pIY->Release ();
}
trace («Client: Zaprosit' nepodderjivaemue Interface»);
IZ* pIZ = NULL;
hr = pIUnknown->QueryInterface (IID_IZ, (void**)&pIZ);
if (SUCCEEDED (hr))
{
trace («Client: Interface IZ polychen»);
pIZ->Fz ();
pIZ->Release ();
}
else
{
trace («Client: No! Interface IZ»);
}
trace («Client: Osvobodit' Interface IUnknown»);
pIUnknown->Release ();
getch ();
return 0;
}
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
ΠΡΠ²ΠΎΠ΄:
Π ΡΡΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΡΠ»ΠΎΠΊ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π²ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² IUnknown — AddRef ΠΈ Release, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Win32 InterlockedIncrement ΠΈ InterlockedDecrement. Π€ΡΠ½ΠΊΡΠΈΡ AddRef Π²ΡΠ·ΡΠ²Π°ΡΡ CreateInstance ΠΈ QueryInterface Π΄Π»Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ. ΠΡΠ·ΠΎΠ²Ρ Release Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠΈΡΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ. ΠΠΈΠΊΠ²ΠΈΠ΄ΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ°.