精华内容
下载资源
问答
  • 一个Variant类型转换成CString的函数,调试过,可以用。
  • _variant_t其他数据类型转换

    万次阅读 2012-04-24 09:53:52
    我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) ..._bstr_t:对BSTR类型进行打包,并提供有用的操作和方法; _com_error:定义抛出的error对象; _com_ptr_t:封装COM接口

    转自:http://kuaixingdong.blog.hexun.com/29627840_d.html

    我们先看看COM所支持的一些类型的基本类:

    (微软提供,在comdef.h中定义)

    在COM中使用的标准类Class如下所示:

    _bstr_t:对BSTR类型进行打包,并提供有用的操作和方法;

    _com_error:定义抛出的error对象;

    _com_ptr_t:封装COM接口指针

    _variant_t:对VARIANT类型进行打包,并提供有用的操作和方法;

    一、_variant_t类的简单介绍:

    _variant_t对象封装了VARIANT数据类型。

    The class manages resource allocation and deallocation and makes function calls to VariantInit and VariantClear as appropriate.

    (1) _variant类提供的方法:

    1> 构造函数

    _variant_t

    对_variant_t变量初始化调用的是_variant_t的构造函数。我们一般习惯于用一个int型的变量对数字类的变量进行初始化,这对_variant_t变量是不允许的。

    原因很简单,_variant_t 的构造函数中没有用整型( Int )对其初始化的构造函数

    可先将整型转化成long,然后再对其进行初始化

    2> Attach()

    Attaches a VARIANT object into the _variant_t object.

    3> Clear()

    Clears the encapsulated VARIANT object.

    4> ChangeType

    Changes the type of the _variant_t object to the indicated VARTYPE.

    5> Detach

    Detaches the encapsulated VARIANT object from this _variant_t object.

    6> SetString

    将一个string赋值给_variant_t对象;

    7> Operators

    赋值操作,给现有的_variant_t对象赋一个新值;

    8> operator ==, !=

    对比两个 _variant_t 对象是否相等;

    9> Extractors

    Extract data from the encapsulated VARIANT object.

    (2) _variant_t的定义:

    _variant_t类封闭了VARIANT数据类型,VARIANT是一个结构体类型,我们可以看一下它的定义

    typedef struct tagVARIANT 
    {
    	VARTYPE vt;								//存储数据类型
    	unsigned short wReserved1;
    	unsigned short wReserved2;
    	unsigned short wReserved3;
    	union 
    	{
    		Byte 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.
    		DECIMAL FAR* pdecVal				// VT_BYREF|VT_DECIMAL.
    		IUnknown FAR* punkVal;				// VT_UNKNOWN.
    		IDispatch FAR* pdispVal;			// VT_DISPATCH.
    		SAFEARRAY FAR* parray;				// VT_ARRAY|*.
    		Byte 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.
    		char cVal;							// VT_I1.
    		unsigned short uiVal;				// VT_UI2.
    		unsigned long ulVal;				// VT_UI4.
    		int intVal;							// VT_INT.
    		unsigned int uintVal;				// VT_UINT.
    		char FAR * pcVal;					// VT_BYREF|VT_I1.
    		unsigned short FAR * puiVal;		// VT_BYREF|VT_UI2.
    		unsigned long FAR * pulVal;			// VT_BYREF|VT_UI4.
    		int FAR * pintVal;					// VT_BYREF|VT_INT.
    		unsigned int FAR * puintVal;		//VT_BYREF|VT_UINT.
    	};
    };
    注意:vt用来存储内部变量(联合体中保存的变量)的类型,联合体用来存储对应类型的值

    二、数据类型转换

    _bstr_t类可以作为_variant_t类与基本数据类型转换的中介

    (1) _variant_t与CString之间的转化

    1> CString转换为_variant_t:

    CString str;
    _variant_t str1=(LPCTSTR)str; 
    使用_variant_t的成员函数SetString来对_variant_t的对象赋值会更好;

    2> _variant_t转换为CString:

    _variant_t vt;
    CString tempstr=(LPCSTR)_bstr_t(vt);         //_bstr_t的构造函数有对_variant_t类型的处理

    (2) _variant_t与char *之间的转换

    1> char * 转换为_variant_t

    方法与CString转换为_variant_t的方法类似:

    char * cValue;
    _variant_t vValue=(LPSTR)cValue;
    2> _variant_t转换为char *:

    错误方法:

    _variant_t vValue;
    char * value=(LPSTR)(LPCSTR)_bstr_t(vValue)

    value指向一堆乱码...

    原因:不能用char *直接指向(LPSTR)(LPCSTR)_bstr_t( _variant_t ),因为这样转换之后实际上是一个string,而非一个char *

    正确方法:

    进行转换时,只能用strcpy(),将LPSTR指向的字符复制到char * 所指向的内存中;

    如下例:

    _variant_t vValue;
    char cValue[16]={0};
    strcpy(cValue, (LPCSTR)_bstr_t(vValue));

    (3) 判断_variant_t的值类型

    下面的转换代码根据_variant_t的vt进行类型判断,然后将数据值转换为CString类型(可作为转换为其他数据类型的中介)

    CString str;
    
    //以下代码演示如何转换为C标准字符串型
    switch(var.vt)
    {
    	case VT_BSTR:
    	{
    		str=var.bstrVal;
    		break;
    	}
    	case VT_I2: //var is short int type 
    	{
    		str.Format("%d",(int)var.iVal);
    		break;
    	}
    	case VT_I4: //var is long int type
    	{
    		str.Format("%d", var.lVal);
    		break;
    	}
    	case VT_R4: //var is float type
    	{
    		str.Format("%10.6f", (double)var.fltVal);
    		break;
    	}
    	case VT_R8: //var is double type
    	{
    		str.Format("%10.6f", var.dblVal);
    		break;
    	}
    	case VT_CY: //var is CY type
    	{
    		str=COleCurrency(var).Format();
    		break;
    	}
    	case VT_DATE: //var is DATE type
    	{
    		str=COleDateTime(var).Format();
    		break;
    	}
    	case VT_BOOL: //var is VARIANT_BOOL
    	{
    		str= (var.boolVal==0) ?"FALSE": "TRUE";
    		break;
    	}
    	default:
    	{
    		str.Format("Unk type %d\n",var.vt);
    		TRACE("Unknown type %d\n",var.vt);
    		break;
    	}
    }





    展开全文
  • //Create a BSTR and assign it to a Variant BSTR x = SysAllocString(L"Hello"); VARIANT myVariant; myVariant.vt = VT_BSTR; myVariant.bstrVal = x; SysFreeString(x); //Create a CString ...

    //Create a BSTR and assign it to a Variant
    BSTR x = SysAllocString(L"Hello");
    VARIANT myVariant;
    myVariant.vt = VT_BSTR;
    myVariant.bstrVal = x;
    SysFreeString(x);

    //Create a CString and change it to a variant;
    CString myCString(_T("My String"));
    CString mySecondString;


    //This is required to use the T2COLE macro.
    USES_CONVERSION;



    BSTR y = SysAllocString(T2COLE(myCString));
    myVariant.bstrVal = y;
    mySecondString = y;
    SysFreeString(y);


    //Create two BSTRs and add them.
    BSTR a = SysAllocString(L"One two ");
    BSTR b = SysAllocString(L"three four.");
    _bstr_t my_bstr_t(a, TRUE);
    my_bstr_t += b;
    myVariant.bstrVal = my_bstr_t;
    // or
    myVariant.bstrVal = _bstr_t(a, FALSE) + b;

    //Change a bstr to a CString.
    CString ANewString(b);
    //or if CString already exists.
    myCString = b;

    //Use of CComBSTR
    CComBSTR myCComBSTR(L"Hello");
    myCComBSTR.Append(L", how are you?");
    VARIANT varFromCCom;
    varFromCCom.vt = VT_BSTR;
    varFromCCom.bstrVal = myCComBSTR

    展开全文
  • _variant_t类型转换

    2011-05-16 23:44:11
    将 _variant_t 类型的变量,转换成任意类型
  • VARIANT类型的用法

    2021-03-04 05:04:57
    对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:VARIANT va;int a=2001;va.vt=VT_I4;///指明整型数据va.lVal=a; ///赋值对于不马上赋值的VARIANT,最好...

    VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。

    对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:

    VARIANT va;

    int a=2001;

    va.vt=VT_I4;///指明整型数据

    va.lVal=a; ///赋值

    对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:

    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; VT_BYREF

    _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。

    例如:

    long l=222;

    ing i=100;

    _variant_t lVal(l);

    lVal = (long)i;

    COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:

    COleVariant v3 = "字符串", v4 = (long)1999;

    CString str =(BSTR)v3.pbstrVal;

    long i = v4.lVal;

    展开全文
  • 主要实现vccom组件之间数据类型的转换(VARIANT与基本数据类型转换
  • Variant是一种数据结构( ),可用于表示任何其他数据类型。 您定义各种可能的类型,并且变体在任何时候只能代表这些类型之一。 一个很好的用法是代表您的React / Redux应用程序状态的一部分。 const Any = ( ) =>...
  • CString 转换VARIANT类型

    千次阅读 2014-05-12 12:18:24
    CString strVar VARIANT varValue; varValue.vt=VT_BSTR; varValue.bstrVal=(_bstr_t)Var; m_ctlSpread.SetText( varValue);

    CString strVar = _T("hello");

    VARIANT varValue;

    varValue.vt=VT_BSTR;

    varValue.bstrVal=(_bstr_t)strVar;


    m_ctlSpread.SetText( varValue);
    展开全文
  • 可以给相同的Variant分配不同的数据类型,只要Variant包含数字值就可以执行算法; variant数组只不过是variant型的数组,不必包含同类型的数据; 1、 VarArrayOf函数:更快捷的创建一维变体数组,可
  • Variant类型转换成CString代码

    千次阅读 2016-10-16 14:52:21
    在对数据库操作中通常都会用到Variant 和_bstr_t类型,在网上也有很多关于这方面的代码。而在进行MFC等程序中,通常都会用到CString类。从Variant转换成CString代码如下:view plaincopy to clipboardprint? CString...
  •  一:_variant_t类型转换成CString和CTime类型 1. _variant_t类型转换为CString类型  _variant_t value;  CString str=(LPCTSTR)(_bstr_t)value;   2. _variant_t类型转换为CTime类型  //...
  • DATE, TIME, DATETIME, TIMESTAMP java.lang.String, java.sql.Date, java.sql.Timestamp Columns with an unsigned numeric type in MySQL are treated as the next 'larger' Java type that the signed variant ...
  • 因为近期工作需要完成OCX控件同时支持C#C++调用,所以接口设置就会遇上些问题。在需要将图片的内存数据(buffer)传入控件时,如果按照C++惯例,设计接口参数类型为unsigned char*,就会存在被C#识别为ref byte的...
  • 说明:本文纯粹是总结一下有关类型转换的贴子, 本人并未对所有方法都做测试,仅仅是为了给大家一个参考。 读者层次:初学 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]=”程...
  • _variant_t vFieldValue=m_pRs->GetCollect("出生年月");要将vFieldValue赋值给一个COLEDateTime类型,怎么转化的问题: ::VariantChangeType(&...//转换成时间类型  m_birthday=vFieldValue.date; 使用Var
  • VARIANT 数据类型

    千次阅读 2017-08-15 11:48:31
    VARIANT 数据类型在文件OAIDL.IDL中定义如下:  【vc中数据类型,对应类为_variant_t】 struct tagVARIANT {  union {  struct __tagVARIANT {  VARTYPE vt;  WORD wReserved1;  
  • C++变体数据类型—— VARIANT

    万次阅读 2018-03-14 16:01:25
    百度百科:Variant 音标 Phonetic symbol [] 词性及解释 Part of speech and defination n.... 变异体, 变型, 变种 Variant 数据类型是所有没被显式声明(用如 Dim、Private、Public 或 Static等语句)为其他类...
  • _variant_t相关类型之间的转换

    千次阅读 2015-05-15 16:14:08
    (1)字符串CString:  _variant_t temp;  CString str_wtdw;  str_wtdw=temp.bstrVal; ...(2)整数int: ... _variant_t temp;... //有时根据不同的整数类型需要采用相关的操作,例如:  value=temp.intVal;
  • 为了进行sql_variant比较,SQL Server 数据类型层次结构顺序划分为多个数据类型系,sql_variant数据类型在用于转换的数据类型层次结构列表中位于顶部。数据类型层次结构数据类型系列sql_variantsql_variantdatetime2...
  • VARIANT型变量转换

    千次阅读 2013-11-05 22:26:23
     我们怎么把一个整形或double型等其它的类型赋值给VARIANT型变量呢,或者是VARIANT型变量怎么赋值给int等其它类型呢。 2、 VARIANT是一个结构体,它的结构体如下: struct tagVARIANT {  union {  
  • 关于C++ variant 类型问题

    千次阅读 2017-02-20 16:50:12
    一直想知道C++标准库有没有类似Qt下QVariant功能的类。...2. _variant_t 这个在 comutil.h 文件内, 应该主要是windows 下的解决方案.。. 3.boost variant 和 boost any 麻烦的是需要引用boost
  • 刚接触VC编程的朋友往往对许多数据类型转换感到迷惑不解,本文将介绍一些常用数据类型的使用。 我们先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119;
  • 类型和子类型替换原则/* Layout-provided Styles */dfn.lyxnoun {font-variant: small-caps;}h1.title {font-size: x-large;margin-bottom: 1ex;text-align: center;}h2.section {font-weight: bold;font-size: x-...
  • VBA数据类型和类型转换函数

    万次阅读 2017-07-10 23:41:07
    一、数据类型 1、Boolean--2字节--0~255 2、Byte--1字节--True或False 3、Integer--2字节--32768~32767(注意范围) 4、Long--4字节--2147483648~2147483647(推荐) 5、Single--4字节---3.402823E38~-1....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,809
精华内容 9,123
关键字:

variant类型与转换