使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语言(C++)实现的方法。
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
VARIANT 数据类型在文件OAIDL.IDL中定义如下:
- struct tagVARIANT {
- union {
- struct __tagVARIANT {
- VARTYPE vt;
- WORD wReserved1;
- WORD wReserved2;
- WORD wReserved3;
- union {
- ULONGLONG ullVal; /* VT_UI8 */
- LONGLONG llVal; /* VT_I8 */
- LONG lVal; /* VT_I4 */
- BYTE bVal; /* VT_UI1 */
- SHORT iVal; /* VT_I2 */
- FLOAT fltVal; /* VT_R4 */
- DOUBLE dblVal; /* VT_R8 */
- VARIANT_BOOL boolVal; /* VT_BOOL */
- _VARIANT_BOOL bool; /* (obsolete) */
- SCODE scode; /* VT_ERROR */
- CY cyVal; /* VT_CY */
- DATE date; /* VT_DATE */
- BSTR bstrVal; /* VT_BSTR */
- IUnknown * punkVal; /* VT_UNKNOWN */
- IDispatch * pdispVal; /* VT_DISPATCH */
- SAFEARRAY * parray; /* VT_ARRAY */
- BYTE * pbVal; /* VT_BYREF|VT_UI1 */
- SHORT * piVal; /* VT_BYREF|VT_I2 */
- LONG * plVal; /* VT_BYREF|VT_I4 */
- LONGLONG * pllVal; /* VT_BYREF|VT_I8 */
- FLOAT * pfltVal; /* VT_BYREF|VT_R4 */
- DOUBLE * pdblVal; /* VT_BYREF|VT_R8 */
- VARIANT_BOOL *pboolVal; /* VT_BYREF|VT_BOOL */
- _VARIANT_BOOL *pbool; /* (obsolete) */
- SCODE * pscode; /* VT_BYREF|VT_ERROR */
- CY * pcyVal; /* VT_BYREF|VT_CY */
- DATE * pdate; /* VT_BYREF|VT_DATE */
- BSTR * pbstrVal; /* VT_BYREF|VT_BSTR */
- IUnknown ** ppunkVal; /* VT_BYREF|VT_UNKNOWN */
- IDispatch ** ppdispVal; /* VT_BYREF|VT_DISPATCH */
- SAFEARRAY ** pparray; /* VT_BYREF|VT_ARRAY */
- VARIANT * pvarVal; /* VT_BYREF|VT_VARIANT */
- PVOID byref; /* Generic ByRef */
- CHAR cVal; /* VT_I1 */
- USHORT uiVal; /* VT_UI2 */
- ULONG ulVal; /* VT_UI4 */
- INT intVal; /* VT_INT */
- UINT uintVal; /* VT_UINT */
- DECIMAL * pdecVal; /* VT_BYREF|VT_DECIMAL */
- CHAR * pcVal; /* VT_BYREF|VT_I1 */
- USHORT * puiVal; /* VT_BYREF|VT_UI2 */
- ULONG * pulVal; /* VT_BYREF|VT_UI4 */
- ULONGLONG * pullVal; /* VT_BYREF|VT_UI8 */
- INT * pintVal; /* VT_BYREF|VT_INT */
- UINT * puintVal; /* VT_BYREF|VT_UINT */
- struct __tagBRECORD {
- PVOID pvRecord;
- IRecordInfo * pRecInfo;
- } __VARIANT_NAME_4; /* VT_RECORD */
- } __VARIANT_NAME_3;
- } __VARIANT_NAME_2;
- DECIMAL decVal;
- } __VARIANT_NAME_1;
- };
使用VARIANT和VARIANTARG数据结构要分两步完全。举一个例子,让我们考虑如下代码:
- long lValue = 999;
- VARIANT vParam;
- vParam.vt = VT_I4;
- vParam.lVal = lValue;
在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域使用的名称是lVal。
使用char指针时 需要分配空间
VARIANT var;
char achValue[2048] = {0};
var.pcVal = achValue;
string strTest= var1.pcVal;