ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Π½Π° Visual Basic ΠΈ Java, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ C++, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΈΠ΄ΡΡ QueryInterface, AddRef ΠΈΠ»ΠΈ Release. ΠΠ»Ρ ΡΡΠΈΡ Π΄Π²ΡΡ ΡΠ·ΡΠΊΠΎΠ² Π΄Π΅ΡΠ°Π»ΠΈ IUnknown Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΡΠΊΡΡΡΡ Π·Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠΈ ΡΠ·ΡΠΊΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½ΠΎΠΉ. ΠΠ° Java QueryInterface ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ°:
public void TryToSnoreAndIgnore(Object obj)
{
IPug pug;
try
{
pug = (IPug)obj;
// VM calls QueryInterface
// VM Π²ΡΠ·ΡΠ²Π°Π΅Ρ QueryInterface
pug.Snore();
}
catch (Throwable ex)
{
// ignore method or QI failures
// ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΡΠ±ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈΠ»ΠΈ QI
}
ICat cat;
try
{
cat = (ICat)obj;
// VM calls QueryInterface
// VM Π²ΡΠ·ΡΠ²Π°Π΅Ρ QueryInterface
cat.IgnoreMaster();
}
catch (Throwable ex)
{
// ignore method or QI failures
// ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ ΡΠ±ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈΠ»ΠΈ QI
}
}
Visual Basic Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ². ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ°, Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° (VM) Visual Basic ΠΌΠΎΠ»ΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅Ρ QueryInterface ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°:
Sub TryToSnoreAndIgnore(obj as Object)
On Error Resume Next
' ignore errors
' ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ
Dim pug as IPug
Set pug = obj
' VM calls QueryInterface
' VM Π²ΡΠ·ΡΠ²Π°Π΅Ρ QueryInterface
If Not (pug is Nothing)
Then pug.Snore
End
if Dim cat as ICat
Set cat = obj
' VM calls QueryInterface
' VM Π²ΡΠ·ΡΠ²Π°Π΅Ρ QueryInterface
If Not (cat is Nothing)
Then cat.IgnoreMaster
End if End Sub
ΠΠ±Π΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Ρ, ΠΊΠ°ΠΊ Java, ΡΠ°ΠΊ ΠΈ Visual Basic, Π²ΡΠ±ΡΠΎΡΡΡ ΠΏΡΠΈ ΡΠ±ΠΎΠ΅ QueryInterface ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. Π ΠΎΠ±Π΅ΠΈΡ ΡΡΠ΅Π΄Π°Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠ·ΡΠΊΠΎΠ²ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΆΠΈΠ²ΡΡΠ΅ΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΡΠ²Π½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ AddRef ΠΈ Release , ΠΈΠ·Π±Π°Π²Π»ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΠΎΡ ΡΡΠΎΠΉ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ.
ΠΠ΄Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ°, ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΡΠΏΠΎΡΠΎΠ±Π½Π°Ρ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π‘ΠΠ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΠΈΠ· C++, ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠΊΡΡΡΡ ΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ. ΠΡΠΎ ΡΡΡΡΠ°Π½ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ (raw ) Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² IUnknown. Π ΠΈΠ΄Π΅Π°Π»Π΅ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π‘ΠΠ Π±ΡΠ΄Π΅Ρ:
ΠΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΠ·ΠΎΠ² Add/Release Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π² Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ΅, ΡΡΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΡΡΡΠ° ΠΈ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ (Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΡ) ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠΏΠΎΠ² C++ Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² QueryInterface.
ΠΡΠΎΠ·ΡΠ°ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π½Π΅Π·Π°ΠΌΠ΅ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ) Π·Π°ΠΌΠ΅ΡΠ°Π΅Ρ Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π² ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ Π±Π΅Π· ΠΊΠΎΠΌΠΏΡΠΎΠΌΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΡΠ½ΠΊΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΡΠ΅ΡΡΠ΅Π·Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Π·Π°Π±ΠΈΡ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ Π‘ΠΠ-ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠ΄Π΅Π»ΡΠ²Π°ΡΡ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΡ Π·Π°ΠΌΠ΅Π½Ρ ΠΎΠ±ΡΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²Π²ΠΎΠ΄ΡΡ ΡΡΠΎΠ»ΡΠΊΠΎ ΠΆΠ΅ ΡΠΊΡΡΡΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅ΡΠ΅Π½Π΄ΡΡΡ ΡΡΡΡΠ°Π½ΠΈΡΡ. Visual C++ 5.0, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ ΡΡΠ΅ΠΌΡ ΡΠ°ΠΊΠΈΠΌΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ (ΠΎΠ΄ΠΈΠ½ Π½Π° MSC, Π΄ΡΡΠ³ΠΎΠΉ Π½Π° ATL, Π° ΡΡΠ΅ΡΠΈΠΉ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Direct-to-COM), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, ΡΠ°ΠΊ ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. Π ΡΠ΅Π½ΡΡΠ±ΡΡΡΠΊΠΎΠΌ 1995 Π³ΠΎΠ΄Π° ΠΈ Π² ΡΠ΅Π²ΡΠ°Π»ΡΡΠΊΠΎΠΌ 1996 Π³ΠΎΠ΄Π° Π²ΡΠΏΡΡΠΊΠ°Ρ "C++ Report " ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Ρ Π΄Π²Π΅ ΡΡΠ°ΡΡΠΈ, Π³Π΄Π΅ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΠΌΠ½ΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ[1]. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ Π‘ΠΠ-ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠΈΡ Π΄Π²ΡΡ ΡΡΠ°ΡΠ΅ΠΉ. Π Π½Π΅ΠΌ Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΡΠ΅ΡΡΡ ΠΎΠ±ΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠ»ΡΡΠ°ΡΡΠΈΠ΅ΡΡ ΠΊΠ°ΠΊ Π² ΠΏΡΠΎΡΡΡΡ , ΡΠ°ΠΊ ΠΈ Π² ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡ Π‘ΠΠ. ΠΠ»Π°ΡΡ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, SmartInterface , ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π° ΡΠ°Π±Π»ΠΎΠ½Π½ΡΡ (template) ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°: ΡΠΈΠΏ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π² C++ ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ IID . ΠΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ IUnknown ΡΠΊΡΡΡΡ ΠΏΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²:
#include Β«smartif.hΒ»
void TryToSnoreAndIgnore(/* [in] */ IUnknown *pUnk)
{
// copy constructor calls QueryInterface
// ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ QueryInterface
SmartInterface<IPug, &IIDIPug> pPug = pUnk;
if (pPug)
// typecast operator returns null-ness
// ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΡΠ»Ρ pPug->Snore();
// operator-> returns safe raw ptr
// ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ -> Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΡΠΌΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
// copy constructor calls QueryInterface
// ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ QueryInterface
SmartInterface<ICat, &IIDICat> pCat = pUnk;
if (pCat)
// typecast operator returns null-ness
// ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΡΠ»Ρ pCat->IgnoreMaster();
// operator-> returns safe raw ptr
// ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ -> Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΡΠΌΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
// destructors release held pointers on leaving scope
// Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΏΡΠΈ
// Π²ΡΡ ΠΎΠ΄Π΅ ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
}
ΠΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π²ΡΠ³Π»ΡΠ΄ΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, Π½ΠΎ ΠΌΠΎΠ³ΡΡ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΎΠΏΠ°ΡΠ½ΡΠΌΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ³ΡΡΠΆΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° Π² Π΄ΡΠ΅ΠΌΠΎΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅; Π±ΡΠ΄ΡΠΎ Π±Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΡΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ, ΠΎΡΠ½ΠΎΡΡΡΠ΅Π³ΠΎΡΡ ΠΊ Π‘ΠΠ, ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ. ΠΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΡΠ°ΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ; ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ Π½Π΅ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΠΌ ΡΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π²Π½Π΅ΡΡΠΈ ΡΡΠΎΠ»ΡΠΊΠΎ ΠΆΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠΎΠ², ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΠ΅ΡΠ΅Π· ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ β>. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ Release Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°-ΡΡΡΠ΅Π»ΠΊΠΈ Π±Π΅Π· ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΅Π³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ·ΠΎΠ² Release Π² Π΅Π³ΠΎ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ·Π»ΠΈΡΠ½ΠΈΠΌ ΠΈ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌ.
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ QueryInterface
Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ QueryInterface, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ ΡΠ°Π½Π΅Π΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅, ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ° ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π»ΡΠ±ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠΌ, ΠΈΠΌΠ΅ΡΡΠΈΠΌ Ρ ΠΎΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎ Π‘ΠΠ ΠΈ C++. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΠ΅Π΄Ρ ΠΈ ΠΊΠ°ΡΠΊΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π΄ΠΎΡΡΠΈΡΡ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΠΎΡΡΠΈ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΊΠΎΠ΄Π°. Π’Π°ΠΊΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ Ρ Π‘ΠΠ ΠΊΠ»Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΡΠ°Π±Π»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ IID Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ Π°ΡΠΏΠ΅ΠΊΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ. Π ΡΡΡΠ½ΠΎΡΡΠΈ, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ QueryInterface , ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ ΡΠ°Π½Π΅Π΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅, ΡΡΡΠΎΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² if, Π° ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° staticcast (staticcast ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ Ρ ΡΠΈΠΏΠΎΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ vptr).
Π§ΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ QueryInterface, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΡΠΎ ΡΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ. ΠΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠ°Π±Π»ΠΈΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° IID ΠΈ Π½Π΅ΠΊΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°ΠΉΡΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ vptr ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΠΏΡΠΈΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ Π³ΠΈΠ±ΠΊΠΎΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΊ ΠΎΠ±ΡΡΠ½ΠΎΠΌΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΊ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» inttable.h , ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
// inttable.h (book-specific header file)
// inttable.h (Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π΄Π»Ρ ΡΡΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ)
// typedef for extensibility function
// typedef Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΠΎΡΡΠΈ
typedef HRESULT (*INTERFACEFINDER) (void *pThis, DWORD dwData, REFIID riid, void **ppv);
// pseudo-function to indicate entry is just offset
// ΠΏΡΠ΅Π²Π΄ΠΎΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π·Π°ΠΏΠΈΡΡ ΠΏΡΠΎΡΡΠΎ
// ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ
#define ENTRYISOFFSET INTERFACEFINDER(-1)
// basic table layout // ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ
typedef struct INTERFACEENTRY
{
const IID * pIID;
// the IID to match
// ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ IID
INTERFACEFINDER pfnFinder;
// ΡΡΠ½ΠΊΡΠΈΡ finder DWORD dwData;
// offset/aux data
// Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ offset/aux
} INTERFACEENTRY;
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΌΠ°ΠΊΡΠΎΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡ Π²Π½ΡΡΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ°:
// Inttable.h (book-specific header file)
// Inttable.h (Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ)