variant_t与_bstr_t
来源:互联网 发布:淘宝买家好评语大全 编辑:程序博客网 时间:2024/04/30 03:20
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);}
- variant_t与_bstr_t
- variant_t与_bstr_t
- _bstr_t与BSTR
- _bstr_t与CString相互转换
- BSTR、_bstr_t _variant_t与 CComBSTR
- BSTR、_bstr_t 与 CComBSTR _variant_t
- _bstr_t与CString相互转换
- _bstr_t与CString相互转换
- variant_t 数据类型
- BSTR、_bstr_t与CComBSTR相互转换
- _variant_t ,_bstr_t 与 CString 类区别
- CComBSTR和_bstr_t的关联与区别
- CString与_bstr_t进行比较的问题
- 急急急急 _bstr_t与CString相互转换
- BSTR、_bstr_t与CString、char *转换
- _variant_t ,_bstr_t 与 CString 类有什么区别
- _variant_t ,_bstr_t 与 CString 类有什么区别
- _variant_t ,_bstr_t 与 CString 类有什么区别
- Linux 进程管理
- 知识管理案例:谁来负责知识管理?
- SVN的三个配置文件例子
- 功夫熊猫,中国式的哲学和西方式的搞笑
- 日期格式说明
- variant_t与_bstr_t
- Select语句常见使用方法整理
- Symbian C++ 各种类型之间的转换
- 可激活的 Jini 服务:实现 RMI 激活
- Table 排序
- Basic Translation Rules for TC
- 学习J2EE所看的书籍
- 16个经典面试问题回答思路
- 关于PropertyGrid 下拉列表,C#实现,其实比较简单