wcscpy(g_wsz, bstr);
Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°ΡΠΈΡΠ΅Π½ ΠΎΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ Π½ΡΠ»Π΅Π²ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ:
wcscpy (g_wsz, bstr ? bstr : OLESTR(""));
ΠΠ»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ BSTR Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ustring.h ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ ΠΏΡΠΎΡΡΠ°Ρ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ:
intline OLECHAR *SAFEBSTR(BSTR b)
{
return b ? b : OLESTR("");
}
Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½ΡΠ»Π΅Π²ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ BSTR Π΄Π΅Π»Π°Π΅Ρ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ, Ρ ΠΎΡΡ ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π·Π°ΡΠΎΡΡΡΡ ΠΊΠΎΠ΄ ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΡΡΡΠΌΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌΠΈ.
ΠΡΠΎΡΡΡΠ΅ ΡΠΈΠΏΡ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π½Π° ΡΠΈΡ. 2.6, ΠΌΠΎΠ³ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡ ΡΠ·ΡΠΊΠ° Π‘. IDL ΠΏΠΎΠ΄ΡΠΈΠ½ΡΠ΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ Π‘ Π΄Π»Ρ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ ΡΠ΅Π³ΠΎΠ² (tag namespace). ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ IDL-ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° (typedef):
typedef struct tagCOLOR
{
double red;
double green;
double blue;
} COLOR;
HRESULT SetColor([in] const COLOR *pColor);
Π»ΠΈΠ±ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ struct Π΄Π»Ρ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ΅Π³Π°:
struct COLOR { double red; double green; double blue; };
HRESULT SetColor([in] const struct COLOR *pColor);
ΠΠ΅ΡΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅ΠΉ. ΠΡΠΎΡΡΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²ΡΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΈΠ· Visual Basic, ΡΠ°ΠΊ ΠΈ ΠΈΠ· Java. ΠΠ΄Π½Π°ΠΊΠΎ Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΈΡΠ΅ΡΡΡ ΡΡΠ° ΠΊΠ½ΠΈΠ³Π°, ΡΠ΅ΠΊΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ Visual Basic ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΌ ΡΡΡΡΠΊΡΡΡΡ, Π½ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ ΡΡΡΡΠΊΡΡΡΡ ΡΠ²Π»ΡΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ².
IDL ΠΈ Π‘ΠΠ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (unions). ΠΠ»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ IDL ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ Π² ΡΡΠΎΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π»ΡΡ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡ (discriminator), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π» Π±Ρ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ»Π΅Π½ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ. ΠΡΠΎΡ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ΅Π»ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° (integral type) ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅, ΡΡΠΎ ΠΈ ΡΠ°ΠΌΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΎ Π²Π½Π΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΡΡΡΠΊΡΡΡΡ, ΡΠΎ ΠΎΠ½ΠΎ ΡΡΠΈΡΠ°Π΅ΡΡΡ Π½Π΅ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ (nonencapsulated):
union NUMBER
{
[case(1)] long i;
[case(2)] float f;
};
ΠΡΡΠΈΠ±ΡΡ [case] ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅Π½Π° ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΡΠ²ΠΎΠ΅ΠΌΡ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡΡ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠ²ΡΠ·Π°ΡΡ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡ Ρ Π½Π΅ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΠΌ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π°ΡΡΠΈΠ±ΡΡ [switch_is]:
HRESULT Add([in, switch_is(t)] union NUMBER *pn, [in] short t);
ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡΠΎΠΌ Π² ΠΎΠΊΡΡΠΆΠ°ΡΡΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΡΠΎ ΡΡΠΎΡ ΡΠΎΡΡΠ°Π²Π½ΠΎΠΉ ΡΠΈΠΏ (aggregate type) Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, ΠΈΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΠΌ (discriminated union):
struct UNUMBER
{ short t; [switch_is(t)]
union VALUE
{
[case(1)] long i;
[case(2)] float f;
};
};
Π‘ΠΠ ΠΏΡΠ΅Π΄ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Ρ Visual Basic ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΠ΅Π΅ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠ΅ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΡΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ VARIANT[4] ΠΈ ΠΌΠΎΠΆΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠ»ΠΈ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π±Π°Π·ΠΎΠ²ΡΡ ΡΠΈΠΏΠΎΠ², ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ IDL. ΠΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΈΠΏΠΎΠ² ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡΠ°:
VT_EMPTY nothing
VT_NULL SQL style Null
VT_I2 short
VT_I4 long
VT_R4 float
VT_R8 double
VT_CY CY (64-bit currency)
VT_DATE DATE (double)
VT_BSTR BSTR
VT_DISPATCH IDispatch *
VT_ERROR HRESULT
VT_BOOL VARIANT_BOOL (True=-1, False=0)
VT_VARIANT VARIANT *
VT_UNKNOWN IUnknown *
VT_DECIMAL 16 byte fixed point
VT_UI1 opaque byte
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π²Π° ΡΠ»Π°Π³Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ Π²ΡΡΠ΅ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌΠΈ ΡΠ΅Π³Π°ΠΌΠΈ, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ (variant) ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΡΠ»ΠΊΡ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°:
VT_ARRAY Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ°ΡΡΠΈΠ² SAFEARRAY
VT_BYREF Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠΎΠΉ
Π‘ΠΠ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ API-ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ VARIANT:
// initialize a variant to empty
// ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½Ρ
void VariantInit(VARIANTARG * pvarg);
// release any resources held in a variant
// ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² Π²Π°ΡΠΈΠ°Π½ΡΠ΅
HRESULT VariantClear(VARIANTARG * pvarg);
// deep-copy one variant to another
// ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ
HRESULT VariantCopy(VARIANTARG * plhs, VARIANTARG * prhs);
// dereference and deep-copy one variant into another
// ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅ΠΌ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ
HRESULT VariantCopyInd(VARIANT * plhs, VARIANTARG * prhs);
// convert a variant to a designated type
// ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½Ρ ΠΊ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ ΡΠΈΠΏΡ
HRESULT VariantChangeType(VARIANTARG * plhs, VARIANTARG * prhs, USHORT wFlags, VARTYPE vtlhs);
// convert a variant to a designated type
// ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½Ρ ΠΊ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ ΡΠΈΠΏΡ (Ρ ΡΠ²Π½ΡΠΌ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ)
HRESULT VariantChangeTypeEx(VARIANTARG * plhs, VARIANTARG * prhs, LCID lcid, USHORT wFlags, VARTYPE vtlhs);
ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ VARIANT'Π°ΠΌΠΈ. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠΈ API-ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΉ VARIANT Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ [in]-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°:
HRESULT UseIt([in] VARIANT var);
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ:
VARIANT var;
VariantInit(&var);
// initialize VARIANT
// ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ VARIANT
V_VT(&var) = VT_I4;
// set discriminator
// ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡ
V_I4(&var) = 100;
// set union
// ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
HRESULT hr = pItf->UseIt(var);
// use VARIANT
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ VARIANT
VariantClear(&var);
// free any resources in VARIANT
// ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ VARIANT
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΡΠΎΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ°ΠΊΡΠΎΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π°ΠΊΡΠ΅ΡΡΠΎΡΠ° (accessor) Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ Π΄Π°Π½Π½ΡΡ VARIANT. ΠΠ²Π΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ
V_VT(&var) = VT_I4;
V_I4(&var) = 100;
ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Ρ ΠΊΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ ΡΠ°ΠΌΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ Π΄Π°Π½Π½ΡΡ :
var.vt = VT_I4;
var.lVal = 100;
ΠΠ΅ΡΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° Π‘-ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²ΡΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ VARIANT Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΡΠΎΠΊΠΈ:
STDMETHODIMP MyClass::UseIt( /*[in] */ VARIANT var)
{
// declare and init a second VARIANT
// ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²ΡΠΎΡΠΎΠΉ VARIANT
VARIANT var2;
VariantInit(&var2);
// convert var to a BSTR and store it in var2
// ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² BSTR ΠΈ Π·Π°Π½ΠΎΡΠΈΠΌ Π΅Π΅ Π² var2
HRESULT hr = VariantChangeType(&var2, &var, 0, VT_BSTR);
// use the string
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΡ
if (SUCCEEDED(hr))
{
ustrcpy(m_szSomeDataMember, SAFEBSTR(V_BSTR(&var2)));
// free any resources held by var2
// ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ Π²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ var2
VariantClear(&var2);
}
return hr;
}
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ API-ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° VariantChangeType ΡΠΏΠΎΡΠΎΠ±Π½Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΡΠΈΠΏΠ° ΠΈΠ· VARIANT Π² Π½ΡΠΆΠ½ΡΠΉ ΡΠΈΠΏ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ BSTR).
ΠΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π΄ΠΈΡΠΊΡΡΡΠΈΡ, β ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π‘ΠΠ. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π‘ΠΠ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ². ΠΡΠ»ΠΈ ΡΠΈΠΏ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠΎ ΡΠΈΠΏ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ:
HRESULT GetObject([out] IDog **ppDog);
ΠΡΠ»ΠΈ ΠΆΠ΅ ΡΠΈΠΏ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ΅Π½, ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π΄Π°ΡΡ ΡΠΈΠΏ Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² Π² IDL ΠΈΠΌΠ΅Π΅ΡΡΡ Π°ΡΡΠΈΠ±ΡΡ [iid_is]:
HRESULT GetObject([in] REFIID riid, [out, iid_is(riid)] IUnknown **ppUnk);
Π₯ΠΎΡΡ ΡΡΠ° ΡΠΎΡΠΌΠ° Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΏΠΎΠ»Π½Π΅ Ρ ΠΎΡΠΎΡΠΎ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅ ΠΈΠ·-Π·Π° Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ Ρ QueryInterface:
HRESULT GetObject([in] REFIID riid, [out, iid_is(riid)] void **ppv);
ΠΡΡΠΈΠ±ΡΡ [iid_is] ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ [in], ΡΠ°ΠΊ ΠΈ [out] Π΄Π»Ρ ΡΠΈΠΏΠΎΠ² IUnknown * ΠΈΠ»ΠΈ void *. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠΌ ΡΠΈΠΏΠΎΠΌ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ IID ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΈΠΏΠ°:
IDog *pDog = 0; HRESULT hr = pItf->GetObject(IID_IDog, (void**)&pDog);
Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π° Π±Ρ ΠΌΠ΅ΡΠΎΠ΄ QueryInterface Π΄Π»Ρ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°:
STDMETHODIMP Class::GetObject(REFIID riid, void **ppv)
{
extern IUnknown * g_pUnkTheDog;
return g_pUnkTheDog->QueryInterface(riid, ppv);
}
ΠΠ»Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠΌ ΡΠΈΠΏΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠΌ ΡΠΈΠΏΠΎΠΌ IUnknown.
ΠΡΡΠΈΠ±ΡΡΡ ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°
ΠΠ½ΠΎΠ³Π΄Π° Π±ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΠΊΠΈΠ΅ ΠΎΡΠΊΡΡΡΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΈ/ΠΈΠ»ΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· Π‘ΠΠ-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π‘ΠΠ IDL ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Ρ ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ Π΄Π°Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π»ΠΈΠ±ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π», Π»ΠΈΠ±ΠΎ ΡΠΈΡΠ°Π» ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ Π°ΡΡΠΈΠ±ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°ΠΊΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:
[ object, uuid(0BB3DAE1-11F4-11d1-8C84-0080C73925BA) ]
interface ICollie : IDog
{
// Age is a read-only property
// Age (Π²ΠΎΠ·ΡΠ°ΡΡ) β ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ
[propget] HRESULT Age([out, retval] long *pVal);
// HairCount is a read/write property
// HairCount (ΡΡΠ΅ΡΡΠΈΠΊ Π²ΠΎΠ»ΠΎΡ) β ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ
[propget] HRESULT HairCount([out, retval] long *pVal);
[propput] HRESULT HairCount([in] long val);
// CurrentThought is a write-only property
// CurrentThought (ΡΠ΅ΠΊΡΡΠ°Ρ ΠΌΡΡΠ»Ρ) β ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ
[propput] HRESULT CurrentThought([in] BSTR val);
}
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² [propget] ΠΈ [propput] ΠΈΠ½ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ IDL, ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ, Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ Π² ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ² (property mutators) ΠΈΠ»ΠΈ Π² Π°ΠΊΡΠ΅ΡΡΠΎΡΡ Π½Π° ΡΠ·ΡΠΊΠ°Ρ , ΡΠ²Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°. ΠΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊ Visual Basic ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Age, HairCount ΠΈ CurrentThought ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, ΠΊΠ°ΠΊ ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΡΡΡΡΠΊΡΡΡΡ: