VARIANT的使用
VARIANT是一个联合结构体,完整的定义为:
typedef struct tagVARIANT {union {struct __tagVARIANT {VARTYPE vt;WORD wReserved1;WORD wReserved2;WORD wReserved3;union {LONGLONG llVal;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 *punkVal;IDispatch *pdispVal;SAFEARRAY *parray;BYTE *pbVal;SHORT *piVal;LONG *plVal;LONGLONG *pllVal;FLOAT *pfltVal;DOUBLE *pdblVal;VARIANT_BOOL *pboolVal;_VARIANT_BOOL *pbool;SCODE *pscode;CY *pcyVal;DATE *pdate;BSTR *pbstrVal;IUnknown **ppunkVal;IDispatch **ppdispVal;SAFEARRAY **pparray;VARIANT *pvarVal;PVOID byref;CHAR cVal;USHORT uiVal;ULONG ulVal;ULONGLONG ullVal;INT intVal;UINT uintVal;DECIMAL *pdecVal;CHAR *pcVal;USHORT *puiVal;ULONG *pulVal;ULONGLONG *pullVal;INT *pintVal;UINT *puintVal;struct __tagBRECORD {PVOID pvRecord;IRecordInfo *pRecInfo;} __VARIANT_NAME_4;} __VARIANT_NAME_3;} __VARIANT_NAME_2;DECIMAL decVal;} __VARIANT_NAME_1;
} VARIANT, *LPVARIANT, VARIANTARG, *LPVARIANTARG;
为方便操作,定义了另外一个类_variant_t,完整定义为:
class _variant_t : public ::tagVARIANT {
public:// Constructors//_variant_t() throw();_variant_t(const VARIANT& varSrc) ;_variant_t(const VARIANT* pSrc) ;_variant_t(const _variant_t& varSrc) ;_variant_t(VARIANT& varSrc, bool fCopy) ; // Attach VARIANT if !fCopy_variant_t(short sSrc, VARTYPE vtSrc = VT_I2) ; // Creates a VT_I2, or a VT_BOOL_variant_t(long lSrc, VARTYPE vtSrc = VT_I4) ; // 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) ; // Creates a VT_R8, or a VT_DATE_variant_t(const CY& cySrc) throw(); // Creates a VT_CY_variant_t(const _bstr_t& bstrSrc) ; // Creates a VT_BSTR_variant_t(const wchar_t *pSrc) ; // Creates a VT_BSTR_variant_t(const char* pSrc) ; // Creates a VT_BSTR_variant_t(IDispatch* pSrc, bool fAddRef = true) throw(); // Creates a VT_DISPATCH_variant_t(bool boolSrc) 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_variant_t(char cSrc) throw(); // Creates a VT_I1_variant_t(unsigned short usSrc) throw(); // Creates a VT_UI2_variant_t(unsigned long ulSrc) throw(); // Creates a VT_UI4_variant_t(int iSrc) throw(); // Creates a VT_INT_variant_t(unsigned int uiSrc) throw(); // Creates a VT_UINT
#if (_WIN32_WINNT >= 0x0501)_variant_t(__int64 i8Src) throw(); // Creates a VT_I8_variant_t(unsigned __int64 ui8Src) throw(); // Creates a VT_UI8
#endif// Destructor//~_variant_t() throw() ;// Extractors//operator short() const ; // Extracts a short from a VT_I2operator long() const ; // Extracts a long from a VT_I4operator float() const ; // Extracts a float from a VT_R4operator double() const ; // Extracts a double from a VT_R8operator CY() const ; // Extracts a CY from a VT_CYoperator _bstr_t() const ; // Extracts a _bstr_t from a VT_BSTRoperator IDispatch*() const ; // Extracts a IDispatch* from a VT_DISPATCHoperator bool() const ; // Extracts a bool from a VT_BOOLoperator IUnknown*() const ; // Extracts a IUnknown* from a VT_UNKNOWNoperator DECIMAL() const ; // Extracts a DECIMAL from a VT_DECIMALoperator BYTE() const ; // Extracts a BTYE (unsigned char) from a VT_UI1operator VARIANT() const throw();operator char() const ; // Extracts a char from a VT_I1operator unsigned short() const ; // Extracts a unsigned short from a VT_UI2operator unsigned long() const ; // Extracts a unsigned long from a VT_UI4operator int() const ; // Extracts a int from a VT_INToperator unsigned int() const ; // Extracts a unsigned int from a VT_UINT
#if (_WIN32_WINNT >= 0x0501)operator __int64() const ; // Extracts a __int64 from a VT_I8operator unsigned __int64() const ; // Extracts a unsigned __int64 from a VT_UI8
#endif// Assignment operations//_variant_t& operator=(const VARIANT& varSrc) ;_variant_t& operator=(const VARIANT* pSrc) ;_variant_t& operator=(const _variant_t& varSrc) ;_variant_t& operator=(short sSrc) ; // Assign a VT_I2, or a VT_BOOL_variant_t& operator=(long lSrc) ; // Assign a VT_I4, a VT_ERROR or a VT_BOOL_variant_t& operator=(float fltSrc) ; // Assign a VT_R4_variant_t& operator=(double dblSrc) ; // Assign a VT_R8, or a VT_DATE_variant_t& operator=(const CY& cySrc) ; // Assign a VT_CY_variant_t& operator=(const _bstr_t& bstrSrc) ; // Assign a VT_BSTR_variant_t& operator=(const wchar_t* pSrc) ; // Assign a VT_BSTR_variant_t& operator=(const char* pSrc) ; // Assign a VT_BSTR_variant_t& operator=(IDispatch* pSrc) ; // Assign a VT_DISPATCH_variant_t& operator=(bool boolSrc) ; // Assign a VT_BOOL_variant_t& operator=(IUnknown* pSrc) ; // Assign a VT_UNKNOWN_variant_t& operator=(const DECIMAL& decSrc) ; // Assign a VT_DECIMAL_variant_t& operator=(BYTE bSrc) ; // Assign a VT_UI1_variant_t& operator=(char cSrc) ; // Assign a VT_I1_variant_t& operator=(unsigned short usSrc) ; // Assign a VT_UI2_variant_t& operator=(unsigned long ulSrc) ; // Assign a VT_UI4_variant_t& operator=(int iSrc) ; // Assign a VT_INT_variant_t& operator=(unsigned int uiSrc) ; // Assign a VT_UINT
#if (_WIN32_WINNT >= 0x0501)_variant_t& operator=(__int64 i8Src) ; // Assign a VT_I8_variant_t& operator=(unsigned __int64 ui8Src) ; // Assign a VT_UI8
#endif// Comparison operations//bool operator==(const VARIANT& varSrc) const throw();bool operator==(const VARIANT* pSrc) const throw();bool operator!=(const VARIANT& varSrc) const throw();bool operator!=(const VARIANT* pSrc) const throw();// Low-level operations//void Clear() ;void Attach(VARIANT& varSrc) ;VARIANT Detach() throw();VARIANT& GetVARIANT() throw();VARIANT* GetAddress() ;void ChangeType(VARTYPE vartype, const _variant_t* pSrc = NULL) ;void SetString(const char* pSrc) ; // used to set ANSI string
};
通常的操作方法为,使用VARIANT定义变量,使用 _variant_t 初始化变量值。
但给类成员变量赋值字符串值时会有问题。
例如:
class A{
public; VARIANT m_var;
}A a;
a.m_var = _variant_t(“1234”);
这种情况下,m_var中存放的是个野指针,实际的指针在_variant_t的析构函数中被释放了。
如果是其他类型的数据,这种赋值方式是没问题的。
正确的做法应该是这样的:
m_var.vt=VT_STR;
m_var.bstrVal=SysAllocString("1234");
考虑代码的严谨性,整个类应该这样设计:
class A{
public; VARIANT m_var;A::A(){}A::A(LPCTSTR str){VariantInit(&m_var);m_var.vt = VT_BSTR;m_var.bstrVal=SysAllocString(str);}A::~A(){if (m_var.vt = VT_BSTR){SysFreeString(m_var.bstrVal);}VariantClear(&m_var);}
}
VARIANT的使用相关推荐
- Variant Analysis(变种分析)——使用已知漏洞发掘未知漏洞
文章目录 前言 1.variant Analysis (变种分析)是什么? 从哪里开始 2.常用技术 2.1 控制流分析(Control flow analysis (CFA)) 2.2 数据流分析 ...
- variant 字符串数组_VB数组部分核心知识总结
数组讲解 今天我们来学习有关数组的相关知识. 为了解决大批量的数据处理问题,VB中提供了数组(Array)变量.数组是一种重要的数据结构,在许多程序设计语言中,都要直接或间接用到数组这种数据结构. ...
- Accurate circular consensus long-read sequencing improves variant detection and assembly of a human
Accurate circular consensus long-read sequencing improves variant detection and assembly of a human ...
- Ratatosk - Hybrid error correction of long reads enables accurate variant calling and assembly
Ratatosk - Hybrid error correction of long reads enables accurate variant calling and assembly 长读的 ...
- SAP Variant Conditions in Purchasing using reference characteristics【中英文双语版】
SAP Variant Conditions in Purchasing using reference characteristics SAP变式物料的采购如何玩转?看看这篇你就明白了! I ha ...
- SAP WM LRFMD中Variant参数的影响初探
SAP WM LRFMD中Variant参数的影响初探 目前的LRFMD设置: 仓库号360下账号dicksonjin的设置里,参数Variant为空. 为如下open TO做confirm, TO ...
- C++ VARIANT 学习小记录
一:为什么会有这个? 目前,计算机语言有很多(大哥,为什么不能就那么一样呢?),如C++.Java,此外还有JavaScript.VBScript等脚本语言,它们自立门派,各自维护自己的数据类型. C ...
- 用variant的数据来推导基因表达 | Imputation of Expression Using PrediXcan
一个工具的逻辑得足够完善.意义足够重大,才有资格发在NG上. A gene-based association method for mapping traits using reference tr ...
- variant php,Variant 是什么数据类型?
Variant 是什么数据类型? Variant是一种特殊的数据类型,该类型是没有类型声明字符,作用是能够在运行期间动态的改变类型,并且支持所有简单的数据类型,如整型.浮点.字符串.布尔型.日期时间. ...
- 【VC基础】 4、变式表(Variant Table)
变式表(Variant Table) 这里穿插说明一个小功能--Variant Table,以下面一个具体例子来说明其用法. 比如特性A我们选择"1",自动弹出特性B的值为&quo ...
最新文章
- nginx header参数丢失_Nginx 性能优化有这篇就够了!
- 智源论坛Live丨青年科学家线上报告会日程发布
- Core Animation简介
- Java常见的面试题(一)
- 【杂谈】为了让大家学好深度学习模型设计和优化,有三AI都做了什么
- python基础中apply()函数的正确用法
- 当前微型计算机的主存储器可分为,当前微型计算机的主存储器可分为
- Linux内核分析 - 网络[八]:IP协议
- python标准库学习笔记
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_04-vuejs研究-vuejs基础-v-model指令...
- github fork自己的库,如何同步源库的更新
- VS中的“该文件可能不存在或已被锁定”错误解决办法
- 口碑营销遇见互联网,企业如何做好网络口碑营销?
- android viewpager中每个view,ViewPager系列之 打造一个通用的ViewPager
- 2017普实软件迎新年会报道
- 「构建企业级推荐系统系列」推荐系统的人工调控
- 网站同时支持IPv4和IPv6及仅支持IPv4的程序巧妙转换到支持IPv6
- 深入分析Luminati住宅代理的特点和性能
- 公司两个路由器如何进行互相访问
- Ubuntu 1804 切换国内源
热门文章
- 华为服务器2288H远程连接远程连接管理口
- .NET安全揭秘(奋斗的小鸟)_PDF 电子书
- 一个三节点的PVE 6.1+CEPH集群,因为系统损坏,全部重新安装。
- 黄聪:PHP json_encode中文乱码解决方法
- 李耀于NOIP2010集训出的题 Dvalue
- C语言求自然底数e,求自然对数的底e
- 关于neo4j导入Protégé导出的owl文件遇到的问题
- 强连通分量算法学习笔记
- c语言 return退出函数,C语言中的exit函数 以及他与return函数的区别
- 擎创技术流 | ClickHouse实用工具—ckman教程(15)