关于_bstr_t和 _variant_t
来源:互联网 发布:单片机和嵌入式的区别 编辑:程序博客网 时间:2024/05/16 05:40
先看看代码:
class _bstr_t {public:// Constructors//_bstr_t() throw(); //Default constructor_bstr_t(const _bstr_t& s) throw(); // Copy constructor_bstr_t(const char* s) throw(_com_error); // Construct a _bstr_t from a const char*_bstr_t(const wchar_t* s) throw(_com_error); // Construct a _bstr_t from a const whar_t*_bstr_t(const _variant_t& var) throw(_com_error); _bstr_t(BSTR bstr, bool fCopy) throw(_com_error); // Construct a _bstr_t from a BSTR. If fCopy is FALSE, give control of// data to the _bstr_t without making a new copy// Destructor//~_bstr_t() throw();// Assignment operators//_bstr_t& operator=(const _bstr_t& s) throw(); // Default assign operator_bstr_t& operator=(const char* s) throw(_com_error); // Assign a const char* to a _bstr_t _bstr_t& operator=(const wchar_t* s) throw(_com_error); // Assign a const wchar_t* to a _bstr_t_bstr_t& operator=(const _variant_t& var) throw(_com_error); // Operators//_bstr_t& operator+=(const _bstr_t& s) throw(_com_error); // Concatenate a _bstr_t onto this _bstr_t_bstr_t operator+(const _bstr_t& s) const throw(_com_error); // Return the concatenation of this _bstr_t with another _bstr_t// Friend operators//friend _bstr_t operator+(const char* s1, const _bstr_t& s2) throw(_com_error); // Return the concatenation of a const char* with a _bstr_tfriend _bstr_t operator+(const wchar_t* s1, const _bstr_t& s2) throw(_com_error); // Return the concatenation of a const char* with a _bstr_t// Extractors//operator const wchar_t*() const throw(); // Extract a const wchar_t*operator wchar_t*() const throw(); // Extract a wchar_t*operator const char*() const throw(_com_error); // Extract a const char_t*operator char*() const throw(_com_error); // Extract a char_t*// Comparison operators//bool operator!() const throw(); bool operator==(const _bstr_t& str) const throw();bool operator!=(const _bstr_t& str) const throw();bool operator<(const _bstr_t& str) const throw();bool operator>(const _bstr_t& str) const throw();bool operator<=(const _bstr_t& str) const throw();bool operator>=(const _bstr_t& str) const throw();// Low-level helper functions//BSTR copy() const throw(_com_error); // Extract a copy of the wrapped BSTRunsigned int length() const throw(); // Return the length of the wrapped BSTR// Binary string assign//void Assign(BSTR s) throw(_com_error); // Binary string assignprivate:// Referenced counted wrapper//class Data_t {public:// Constructors//Data_t(const char* s) throw(_com_error);Data_t(const wchar_t* s) throw(_com_error);Data_t(BSTR bstr, bool fCopy) throw(_com_error);Data_t(const _bstr_t& s1, const _bstr_t& s2) throw(_com_error);// Reference counting routines//unsigned long AddRef() throw();unsigned long Release() throw();// Extractors//operator const wchar_t*() const throw();operator const char*() const throw(_com_error);// Low-level helper functions//const wchar_t* GetWString() const throw();const char* GetString() const throw(_com_error);BSTR Copy() const throw(_com_error);void Assign(BSTR s) throw(_com_error);unsigned int Length() const throw();int Compare(const Data_t& str) const throw();private:wchar_t*m_wstr;mutable char*m_str;unsigned longm_RefCount;// Never allow default construction//Data_t() throw();// Never allow copy//Data_t(const Data_t& s) throw();// Prevent deletes from outside. Release() must be used.//~Data_t() throw();void _Free() throw();};private:// Reference counted representation//Data_t* m_Data;private:// Low-level utilities//void _AddRef() throw();void _Free() throw();int _Compare(const _bstr_t& str) const throw();};
class _variant_t : public ::tagVARIANT {public:// Constructors//_variant_t() throw();_variant_t(const VARIANT& varSrc) throw(_com_error);_variant_t(const VARIANT* pSrc) throw(_com_error);_variant_t(const _variant_t& varSrc) throw(_com_error);_variant_t(VARIANT& varSrc, bool fCopy) throw(_com_error);// Attach VARIANT if !fCopy_variant_t(short sSrc, VARTYPE vtSrc = VT_I2) throw(_com_error);// Creates a VT_I2, or a VT_BOOL_variant_t(long lSrc, VARTYPE vtSrc = VT_I4) throw(_com_error);// Creates a VT_I4, a VT_ERROR, or a VT_BOOL_variant_t(float fltSrc) throw();// Creates a VT_R4_variant_t(double dblSrc, VARTYPE vtSrc = VT_R8) throw(_com_error);// Creates a VT_R8, or a VT_DATE_variant_t(const CY& cySrc) throw();// Creates a VT_CY_variant_t(const _bstr_t& bstrSrc) throw(_com_error);// Creates a VT_BSTR_variant_t(const wchar_t *pSrc) throw(_com_error);// Creates a VT_BSTR_variant_t(const char* pSrc) throw(_com_error);// Creates a VT_BSTR_variant_t(IDispatch* pSrc, bool fAddRef = true) throw();// Creates a VT_DISPATCH_variant_t(bool bSrc) throw();// Creates a VT_BOOL_variant_t(IUnknown* pSrc, bool fAddRef = true) throw();// Creates a VT_UNKNOWN_variant_t(const DECIMAL& decSrc) throw();// Creates a VT_DECIMAL_variant_t(BYTE bSrc) throw();// Creates a VT_UI1// Destructor//~_variant_t() throw(_com_error);// Extractors//operator short() const throw(_com_error);// Extracts a short from a VT_I2operator long() const throw(_com_error);// Extracts a long from a VT_I4operator float() const throw(_com_error);// Extracts a float from a VT_R4operator double() const throw(_com_error);// Extracts a double from a VT_R8operator CY() const throw(_com_error);// Extracts a CY from a VT_CYoperator _bstr_t() const throw(_com_error);// Extracts a _bstr_t from a VT_BSTRoperator IDispatch*() const throw(_com_error);// Extracts a IDispatch* from a VT_DISPATCHoperator bool() const throw(_com_error);// Extracts a bool from a VT_BOOLoperator IUnknown*() const throw(_com_error);// Extracts a IUnknown* from a VT_UNKNOWNoperator DECIMAL() const throw(_com_error);// Extracts a DECIMAL from a VT_DECIMALoperator BYTE() const throw(_com_error);// Extracts a BTYE (unsigned char) from a VT_UI1// Assignment operations//_variant_t& operator=(const VARIANT& varSrc) throw(_com_error);_variant_t& operator=(const VARIANT* pSrc) throw(_com_error);_variant_t& operator=(const _variant_t& varSrc) throw(_com_error);_variant_t& operator=(short sSrc) throw(_com_error);// Assign a VT_I2, or a VT_BOOL_variant_t& operator=(long lSrc) throw(_com_error);// Assign a VT_I4, a VT_ERROR or a VT_BOOL_variant_t& operator=(float fltSrc) throw(_com_error);// Assign a VT_R4_variant_t& operator=(double dblSrc) throw(_com_error);// Assign a VT_R8, or a VT_DATE_variant_t& operator=(const CY& cySrc) throw(_com_error);// Assign a VT_CY_variant_t& operator=(const _bstr_t& bstrSrc) throw(_com_error);// Assign a VT_BSTR_variant_t& operator=(const wchar_t* pSrc) throw(_com_error);// Assign a VT_BSTR_variant_t& operator=(const char* pSrc) throw(_com_error);// Assign a VT_BSTR_variant_t& operator=(IDispatch* pSrc) throw(_com_error);// Assign a VT_DISPATCH _variant_t& operator=(bool bSrc) throw(_com_error);// Assign a VT_BOOL_variant_t& operator=(IUnknown* pSrc) throw(_com_error);// Assign a VT_UNKNOWN_variant_t& operator=(const DECIMAL& decSrc) throw(_com_error);// Assign a VT_DECIMAL_variant_t& operator=(BYTE bSrc) throw(_com_error);// Assign a VT_UI1// Comparison operations//bool operator==(const VARIANT& varSrc) const throw(_com_error);bool operator==(const VARIANT* pSrc) const throw(_com_error);bool operator!=(const VARIANT& varSrc) const throw(_com_error);bool operator!=(const VARIANT* pSrc) const throw(_com_error);// Low-level operations//void Clear() throw(_com_error);void Attach(VARIANT& varSrc) throw(_com_error);VARIANT Detach() throw(_com_error);void ChangeType(VARTYPE vartype, const _variant_t* pSrc = NULL) throw(_com_error);void SetString(const char* pSrc) throw(_com_error); // used to set ANSI string};
struct tagVARIANT { union { struct __tagVARIANT { VARTYPE vt; WORD wReserved1; WORD wReserved2; WORD wReserved3; union { LONG lVal; BYTE bVal; SHORT iVal; FLOAT fltVal; DOUBLE dblVal; VARIANT_BOOL boolVal; _VARIANT_BOOL bool; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; IUnknown __RPC_FAR *punkVal; IDispatch __RPC_FAR *pdispVal; SAFEARRAY __RPC_FAR *parray; BYTE __RPC_FAR *pbVal; SHORT __RPC_FAR *piVal; LONG __RPC_FAR *plVal; FLOAT __RPC_FAR *pfltVal; DOUBLE __RPC_FAR *pdblVal; VARIANT_BOOL __RPC_FAR *pboolVal; _VARIANT_BOOL __RPC_FAR *pbool; SCODE __RPC_FAR *pscode; CY __RPC_FAR *pcyVal; DATE __RPC_FAR *pdate; BSTR __RPC_FAR *pbstrVal; IUnknown __RPC_FAR *__RPC_FAR *ppunkVal; IDispatch __RPC_FAR *__RPC_FAR *ppdispVal; SAFEARRAY __RPC_FAR *__RPC_FAR *pparray; VARIANT __RPC_FAR *pvarVal; PVOID byref; CHAR cVal; USHORT uiVal; ULONG ulVal; INT intVal; UINT uintVal; DECIMAL __RPC_FAR *pdecVal; CHAR __RPC_FAR *pcVal; USHORT __RPC_FAR *puiVal; ULONG __RPC_FAR *pulVal; INT __RPC_FAR *pintVal; UINT __RPC_FAR *puintVal; struct __tagBRECORD { PVOID pvRecord; IRecordInfo __RPC_FAR *pRecInfo; }__VARIANT_NAME_4; }__VARIANT_NAME_3; }__VARIANT_NAME_2; DECIMAL decVal; }__VARIANT_NAME_1; };
_variant_t和_bstr_t这两个类分别封装并管理VARIANT和BSTR这两种数据类型,VARIANT和BSTR这两种类型是COM中使用的数据类型。为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。_variant_t和_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了。
//_variant_t转WORD类型BOOL AfxVariantConvert(WORD& val, const _variant_t& vt){if (vt.vt == VT_UI2){val = (WORD)vt.uiVal;return TRUE;}else{val = 0;return FALSE;}}//_variant_t转DWORD类型BOOL AfxVariantConvert(DWORD& val, const _variant_t& vt){if (vt.vt == VT_UI4 ){val = (DWORD)vt.ulVal;return TRUE;}else{val = 0;return FALSE;}}//_variant_t转DWORD64类型BOOL AfxVariantConvert(DWORD64& val, const _variant_t& vt){if (vt.vt != VT_UI8 ){val = (DWORD64)vt.ullVal;return TRUE;}else{val = 0;return FALSE;}}//_variant_t转CString类型BOOL AfxVariantConvert(CString& val, const _variant_t& vt){if (vt.vt == VT_BSTR){val = (LPCTSTR)vt.bstrVal;//val=(LPCTSTR)(_bstr_t)vt;return TRUE;}else{val = _T("");return FALSE;}}//_variant_t转BOOL类型BOOL AfxVariantConvert(BOOL& val, const _variant_t& vt){if (vt.vt == VT_BOOL){val = vt.boolVal;return TRUE;}else{val = FALSE;return FALSE;}}//_variant_t转CTime类型(精度变短,可能丢失数据)BOOL AfxVariantConvert(CTime& val, const _variant_t& vt){if (vt.vt == VT_DATE){val = vt.date;return TRUE;}else{val = NULL;return FALSE;}}//_variant_t转double类型BOOL AfxVariantConvert(DOUBLE& val, const _variant_t& vt){if (vt.vt == VT_R8){val = vt.dblVal;return TRUE;}else{val = 0;return FALSE;}}//_variant_t转byte类型BOOL AfxVariantConvert(BYTE& val, const _variant_t& vt){if (vt.vt == VT_UI1 || vt.vt == VT_I1){val = vt.bVal;return TRUE;}else{val = 0;return FALSE;}}//_variant_t转float类型BOOL AfxVariantConvert( FLOAT& val, const _variant_t& vt ){if (vt.vt == VT_R4){val = vt.fltVal;return TRUE;}else{val = 0;return FALSE;}}//_variant_t转long类型BOOL AfxVariantConvert( long& val,const _variant_t& vt ){if (vt.vt == VT_I4){val = vt.lVal;return TRUE;}else{val = 0;return FALSE;}}//_variant_t转INT64类型BOOL AfxVariantConvert( INT64& val,const _variant_t& vt ){if (vt.vt == VT_I8){val = vt.llVal;return TRUE;}else{val = 0;return FALSE;}}
0 0
- 关于_bstr_t和 _variant_t
- _variant_t和_bstr_t
- _bstr_t 和_variant_t
- _bstr_t和_variant_t
- ADO之_variant_t 和 _bstr_t
- ADO 数据类型_bstr_t 和_variant_t
- _variant_t _bstr_t
- _variant_t _bstr_t
- _variant_t和_bstr_t有什么区别
- MFC ADO数据库编程中的_variant_t和_bstr_t
- VC++通过ADO连接数据库(三)_variant_t和_bstr_t
- MFC ADO数据库编程中的_variant_t和_bstr_t类型
- BSTR、_bstr_t _variant_t与 CComBSTR
- BSTR、_bstr_t 与 CComBSTR _variant_t
- _variant_t ,_bstr_t, CString 类,BSTR
- _variant_t ,_bstr_t 与 CString 类区别
- _variant_t ,_bstr_t 与 CString 类有什么区别
- _variant_t ,_bstr_t 与 CString 类有什么区别
- tabbar 按钮形状自定义显示问题
- 关于Binary Search的写法总结
- maven教程(一)配置环境
- uva 10892 - LCM Cardinality(数论)
- 保安不慎将iPhone掉便池 立即去捞手臂被卡(图)
- 关于_bstr_t和 _variant_t
- 坐标和长宽四舍五入对UI组件(Scroll)的影响: 关键词:Twips(缇)
- 我爱我家
- GCD 和 NSOperationQueue 的差别
- onchage jquery
- 解析JVM内存区域组成
- 后台开发面试要点(腾讯互娱事业群)
- 男子不满女友提分手 刺女友6刀后自杀
- 两世等待,一世相守