variant_t与_bstr_t

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

variant_t与_bstr_t

                                        ----------部分资源来自网络,感谢作者,特此声明

1.      short/long/float/double/char*可通过构造函数或直接赋值转换成_variant_t类型或_bstr_t类型。 _variant_t 可隐式转换为short/long/float/double,所以可以直接用=。 _bstr_t 可隐式转换成char*,所以也可以直接用=。 _variant_t 与 _bstr_t 可互相直接转换。

可以看看comutil.h类的实现 基本就一堆构造函数和重载了很多运算符 就会明白了

 

2.       variant_t 和 _bstr_ BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。它被描述成一个与自动化相兼容的类型。由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。图1描述了BSTR的结构,其中DWORD值是字符串中实际所占用的字节数,且它的值是字符串中Unicode字符的两倍。

在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:

struct tagVARIANT {  VARTYPE vt;  union {   short iVal;      // VT_I2.   long lVal;       // VT_I4.   float fltVal;     // VT_R4.   double dblVal;     // VT_R8.   DATE date;         // VT_DATE.   BSTR bstrVal;     // VT_BSTR.   …   short * piVal;       // VT_BYREF|VT_I2.   long * plVal;        // VT_BYREF|VT_I4.   float * pfltVal;      // VT_BYREF|VT_R4.   double * pdblVal;     // VT_BYREF|VT_R8.   DATE * pdate;         // VT_BYREF|VT_DATE.   BSTR * pbstrVal;     // VT_BYREF|VT_BSTR.  }; };

  显然,VARIANT类型是一个C结构,它包含了一个类型成员vt、一些保留字节以及一个大的union类型。例如,如果vt为VT_I2,那么我们可以从iVal中读出VARIANT的值。同样,当给一个VARIANT变量赋值时,也要先指明其类型。例如:

VARIANT va; :: VariantInit(&va); // 初始化 int a = 2002; va.vt = VT_I4; // 指明long数据类型 va.lVal = a; // 赋值

_variant_t 是一个用于COM的VARIANT类,它的功能与COleVariant相似。不过在Visual C++.NET的MFC应用程序中使用时需要在代码文件前面添加下列两句:

  #i nclude "comutil.h"

  #pragma comment( lib, "comsupp.lib" )

_bstr_t是是C++对BSTR的封装,它的构造和析构函数分别调用SysAllocString和SysFreeString函数,其他操作是借用BSTR API函数。与_variant_t相似,使用时也要添加comutil.h和comsupp.lib。

CString转换成BSTR

通常是通过使用CStringT::AllocSysString来实现。例如:

CString str("This is a test"); BSTR bstrText = str.AllocSysString(); … SysFreeString(bstrText); // 用完释放

BSTR转换成CString

一般可按下列方法进行:

BSTR bstrText = ::SysAllocString(L"Test"); CStringA str; str.Empty(); str = bstrText;

关于数据类型转换由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此Cstring 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。

3.下面是我自己的几段代码(vc2005中调试成功)

写入:

UpdateData();    try {    // 写入各字段值    m_pset->AddNew();    m_pset->PutCollect(long(0),_variant_t(m_name));    m_pset->PutCollect(long(1),_variant_t(m_pass));    m_pset->Update();

       MessageBox(_T("插入成功!"),_T("提示"),MB_OK); } catch(_com_error *e) {    MessageBox(e->ErrorMessage(),_T("数据库读取错误"),MB_OK); }

数据读取:

_try {    _variant_t vfield;    vfield=m_pset->GetCollect(long(0));    m_name=vfield.bstrVal;         vfield=m_pset->GetCollect(long(1));    m_pass=vfield.bstrVal;    /*    m_name=(LPCSTR)_bstr_t(m_pset->GetCollect("UserName"));    m_pass=(LPCSTR)_bstr_t(m_pset->GetCollect("PassWord"));    */    //UpdateData(false); } catch(_com_error&e) {    MessageBox(e.ErrorMessage(),_T("数据库读取错误"),MB_OK); }

常用数据类型使用转换详解 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。我们先定义一些常见类型变量借以说明int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username[]="程佩君";char temp[200];char *buf;CString str;_variant_t v1;_bs 阅读详情

相关推荐

_variant_t和_bstr_t

_variant_t和_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型, VARIANTBSTR这两种类型是COM中使用的数据类型。 实现_variant_t向int,String ,double,long,byte等类型转换 为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。通过_variant_t和_bstr_t这两个类,就可 _...

weixin_30894583的博客 198

关于_variant_t的一些总结

该类型是对COM类型VARIANT数据的封装,方便C/C++数据类型转换 定义在头文件<comutil.h> 实现在comsupp.lib /comsuppd.lib/comsuppw.lib/comsuppwd.lib 【关于构造赋值】 该类封装了各种基本类型构造和赋值函数,可以直接定义赋值: _variant_t vstr = "5"; _variant_t vint = 5; _variant_t vbl = true; 【关于取值和转换】 可以判断vt成员值,根据其准确类型取对应值

shellching的专栏 1110

VC++通过ADO连接数据库(三)_variant_t和_bstr_t

用C++通过ADO对数据库进行操作,往往需要注意数据类型的转换问题。 这时可使用_variant_t和_bstr_t这两个数据类型。它们是两个类,分别封装了 VARIANTBSTR,并增了一些方法。应为COM被设计成跨平台的,所以引入这两种数据类型。 在 COM 里用不了 CString 类,这时需要有一种更普遍的方式来处理字符串以及其他数据。VARIANT 就是一个结构体,内部包含一个

wanglx2012的专栏 1302

_bstr_t 和_variant_t

_variant_t和_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型,  VARIANTBSTR这两种类型是COM中使用的数据类型。   为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。  通过_variant_t和_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了。     m_Pconn->Open((_bstr_t)SQ

thisispan 733

BSTR,_bstr_t,CComBSTR,VARIANT,_variant_t,CString的转换

转载:http://www.cnblogs.com/GoodGoodWorkDayDayUp/archive/2010/11/15/1877655.html VC6.0上编译通过,console程序,使用静态MFC库。也许有不对的地方,欢迎指正 #include #include #include #include void main() {     BSTR bstrT

Erick08的专栏 1194

VC中的_variant_t和_bstr_t

////////////////////////////////////////////////////////////////////////////// // // Wrapper class for VARIANT // ////////////////////////////////////////////////////////////////////////////// /* * VARENUM usage key, * * * [V] - may appear in a VARIANT

htj10的博客 752

_bstr_t和_variant_t

原文来自:http://blog.sina.com.cn/s/blog_5f7dc62e0100dowp.html 担心以后找不到 故而转载 _bstr_t和_variant_t   _variant_t和_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型,VARIANTBSTR这两种类型是COM中使用的数据类型。为了C++中的变量应用到ADO编程中,

u011061503的专栏 984

BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR、_bstr_t

Visual C++.NET涉及到ATL/ATL Server、MFC和托管C++等多种编程方式,不仅功能强大而且应用广泛。在编程中,我们常常会遇到ANSI、Unicode以及BSTR不同编码类 型的字符串转换操作。本文先介绍基本字符串类型,然后说明相关的类,如CComBSTR、_bstr_t、CStringT等,最后讨论它们的转换方法, 其中还包括使用最新ATL7.0的转换类和宏,如CA2CT、

pirate97的专栏 840

浅谈BSTR,_bstr_r,VARIANT,_variant_t. VARIANT类型如何CString互转

http://www.vckbase.com/document/viewdoc/?id=1096 http://www.vckbase.com/document/viewdoc/?id=1082 CW2A(BSTR)      CW2A(_bstr_t)      CW2A(VARIANT.bstrVal)      CW2A(_varaint_t.bstrVal)

xuhuan_wh的专栏 6809

_variant_t和BSTR的例子 (转)

我可以给你例子,是关于_variant_t和BSTR的,大部分的数据类型已经被包括。暂时贴一点给你看:如何互相转换 BSTR 和 标准C字符串以下代码是用在我的一个Com组件中的,原理可以借鉴:STDMETHODIMP CCStr::Upper(BSTR inStr ,BSTR *outStr){/*        要 求:                         com接口传入的参数除了

1347

BSTR、_bstr_t _variant_t CComBSTR

BSTR、_bstr_t CComBSTRBSTR是宽字符指针;_bstr_t是C++对BSTR的封装;CComBSTR 是ATL对BSTR的封装;CComBSTR_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。特别是_bstr_t,建议大家使用它。char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.libSysFreeStrin

liyun422828的专栏 635

BSTR、_bstr_t CComBSTR _variant_t

_variant_t和_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型,VARIANTBSTR这两种类型是COM中使用的数据类型。为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。_variant_t和_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了_variant_t是一种通用数据类型,里面可以放不同类型的数据。 <br />(LPCSTR)_bstr_t(var)   把_variant_t里的通用数据当作字符串读出来,_bstr_t类重

liyun422828的专栏 691

MFC ADO数据库编程中的_variant_t和_bstr_t类型

_variant_t和_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型,即是“Wrapper Class”VARIANTBSTR这两种类型是COM中使用的数据类型,VARIANT类型是一个结构体,而BSTR is  A 32-bit character pointer。为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。_variant_t和_bstr_t这两

贝壳紫铃专栏 1566
上一篇: 战斗机排行榜
下一篇: 巨富裸捐与虚幻的美国榜样
nanoo
博客等级 码龄22年 2粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值