织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>杂项技术>VC(MFC)>

在VC中如何使用VARIANT型变量

罗索客 发布于 2005-11-01 10:41 点击:次 
编号:QA002234 建立日期: 1999年12月12日 最后修改日期:1999年12月12日 所属类别: C/C++ - 其他方面 千代: 操作系统: win98 编程工具: vc++ 问题: 在VC中如何使用VARIANT型变量? 各位老师,在VC中经常遇到作为VARIANT型定义的一些常量或变量,如在CInet控件中的下列
TAG:

编号:QA002234
建立日期: 1999年12月12日 最后修改日期:1999年12月12日
所属类别:

C/C++ - 其他方面

千代:
    操作系统: win98
    编程工具: vc++
    问题: 在VC中如何使用VARIANT型变量?
    各位老师,在VC中经常遇到作为VARIANT型定义的一些常量或变量,如在CInet控件中的下列成员函数:
     VARIANT OpenURL(const VARIANT& URL, const VARIANT& DataType);
     void Execute(const VARIANT& URL, const VARIANT& Operation, const VARIANT& InputData, const VARIANT& InputHdrs);
     VARIANT GetChunk(long* Size, const VARIANT& DataType);
     CString GetHeader(const VARIANT& HdrName);
    其它许多控件都有类似的情况,那么,如何给这种VARIANT型的变量赋值(传送参数)呢??请各位高人指点!!? ? ?

回答:

    VIRIANT是ACTIVEX AUTOMATION需要用到的一种变量类型,可以称之为通用数据类型,其实它是一个结构。如果仅仅是调用ACTIVEX对象所提供的METHOD不需知道其中的细节。它仅用于通过IDISPATCH接口调用特定的METHOD或属性时用,VB和VC已经将这一过程透明。(主持人注:换句话说,VC会自动转换简单数据类型。)
    关于下面的几个METHOD,例如OPENURL,在VB中原形是object.OpenUrl(url [,datatype] url是有效的URL字符串, DATATYPE是整形,返回指定URL的文档。在MFC中是CInternetSession::OpenURL
    CStdioFile* OpenURL( LPCTSTR pstrURL, DWORD dwContext = 1, DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLength = 0 );
    Throw ( CInternetException );
    VARIANT的定义如下:
    typedef struct FARSTRUCT tagVARIANT VARIANT;
    typedef struct FARSTRUCT tagVARIANT VARIANTARG;
    
    typedef struct tagVARIANT {
     VARTYPE vt;
     unsigned short wReserved1;
     unsigned short wReserved2;
     unsigned short wReserved3;
     union {
     unsigned char bVal; // VT_UI1.
     short iVal; // VT_I2 .
     long lVal; // VT_I4 .
     float fltVal; // VT_R4 .
     double dblVal; // VT_R8 .
     VARIANT_BOOL boolVal; // VT_BOOL.
     SCODE scode; // VT_ERROR.
     CY cyVal; // VT_CY .
     DATE date; // VT_DATE.
     BSTR bstrVal; // VT_BSTR.
     IUnknown FAR* punkVal; // VT_UNKNOWN.
     IDispatch FAR* pdispVal; // VT_DISPATCH.
     SAFEARRAY FAR* parray; // VT_ARRAY|*.
     unsigned char FAR* pbVal; // VT_BYREF|VT_UI1.
     short FAR* piVal; // VT_BYREF|VT_I2.
     long FAR* plVal; // VT_BYREF|VT_I4.
     float FAR* pfltVal; // VT_BYREF|VT_R4.
     double FAR* pdblVal; // VT_BYREF|VT_R8.
     VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.
     SCODE FAR* pscode; // VT_BYREF|VT_ERROR.
     CY FAR* pcyVal; // VT_BYREF|VT_CY.
     DATE FAR* pdate; // VT_BYREF|VT_DATE.
     BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.
     IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.
     IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
     SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.
     VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
     void FAR* byref; // Generic ByRef.
     };
    };
    主持人注:VARIANT结构的vt是很重要,它相当VB的VarType函数。
    另外,参考QA002126 "如何设置ActiveX控件图片属性(LPDISPATCH类型)的值"。
    韩焕新问:
    使用MS Communication Controls 6.0时,串口返回的数据类型也是VARIANT,如何从这个结构中提取所要求的字符串呢,发送时又如何给它赋值呢。谢谢。
    主持人回答:不要使用CString同这个控件交换数据,应该使用CByteArray类型来同VARIANT进行转换。详见《电子技术应用》杂志1998年9期的《再谈用VC++开发Windows环境下串行通信程序》。

此问题由FALL回答。 (iwgh)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200511/491.html]
本文出处: 作者:iwgh
顶一下
(1)
50%
踩一下
(1)
50%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容