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的使用相关推荐

  1. Variant Analysis(变种分析)——使用已知漏洞发掘未知漏洞

    文章目录 前言 1.variant Analysis (变种分析)是什么? 从哪里开始 2.常用技术 2.1 控制流分析(Control flow analysis (CFA)) 2.2 数据流分析 ...

  2. variant 字符串数组_VB数组部分核心知识总结

    ‍数组讲解 今天我们来学习有关数组的相关知识. 为了解决大批量的数据处理问题,VB中提供了数组(Array)变量.数组是一种重要的数据结构,在许多程序设计语言中,都要直接或间接用到数组这种数据结构. ...

  3. 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 ...

  4. 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   长读的 ...

  5. SAP Variant Conditions in Purchasing using reference characteristics【中英文双语版】

    SAP Variant Conditions in Purchasing using reference characteristics  SAP变式物料的采购如何玩转?看看这篇你就明白了! I ha ...

  6. SAP WM LRFMD中Variant参数的影响初探

    SAP WM LRFMD中Variant参数的影响初探 目前的LRFMD设置: 仓库号360下账号dicksonjin的设置里,参数Variant为空. 为如下open TO做confirm, TO ...

  7. C++ VARIANT 学习小记录

    一:为什么会有这个? 目前,计算机语言有很多(大哥,为什么不能就那么一样呢?),如C++.Java,此外还有JavaScript.VBScript等脚本语言,它们自立门派,各自维护自己的数据类型. C ...

  8. 用variant的数据来推导基因表达 | Imputation of Expression Using PrediXcan

    一个工具的逻辑得足够完善.意义足够重大,才有资格发在NG上. A gene-based association method for mapping traits using reference tr ...

  9. variant php,Variant 是什么数据类型?

    Variant 是什么数据类型? Variant是一种特殊的数据类型,该类型是没有类型声明字符,作用是能够在运行期间动态的改变类型,并且支持所有简单的数据类型,如整型.浮点.字符串.布尔型.日期时间. ...

  10. 【VC基础】 4、变式表(Variant Table)

    变式表(Variant Table) 这里穿插说明一个小功能--Variant Table,以下面一个具体例子来说明其用法. 比如特性A我们选择"1",自动弹出特性B的值为&quo ...

最新文章

  1. nginx header参数丢失_Nginx 性能优化有这篇就够了!
  2. 智源论坛Live丨青年科学家线上报告会日程发布
  3. Core Animation简介
  4. Java常见的面试题(一)
  5. 【杂谈】为了让大家学好深度学习模型设计和优化,有三AI都做了什么
  6. python基础中apply()函数的正确用法
  7. 当前微型计算机的主存储器可分为,当前微型计算机的主存储器可分为
  8. Linux内核分析 - 网络[八]:IP协议
  9. python标准库学习笔记
  10. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_04-vuejs研究-vuejs基础-v-model指令...
  11. github fork自己的库,如何同步源库的更新
  12. VS中的“该文件可能不存在或已被锁定”错误解决办法
  13. 口碑营销遇见互联网,企业如何做好网络口碑营销?
  14. android viewpager中每个view,ViewPager系列之 打造一个通用的ViewPager
  15. 2017普实软件迎新年会报道
  16. 「构建企业级推荐系统系列」推荐系统的人工调控
  17. 网站同时支持IPv4和IPv6及仅支持IPv4的程序巧妙转换到支持IPv6
  18. 深入分析Luminati住宅代理的特点和性能
  19. 公司两个路由器如何进行互相访问
  20. Ubuntu 1804 切换国内源

热门文章

  1. 华为服务器2288H远程连接远程连接管理口
  2. .NET安全揭秘(奋斗的小鸟)_PDF 电子书
  3. 一个三节点的PVE 6.1+CEPH集群,因为系统损坏,全部重新安装。
  4. 黄聪:PHP json_encode中文乱码解决方法
  5. 李耀于NOIP2010集训出的题 Dvalue
  6. C语言求自然底数e,求自然对数的底e
  7. 关于neo4j导入Protégé导出的owl文件遇到的问题
  8. 强连通分量算法学习笔记
  9. c语言 return退出函数,C语言中的exit函数 以及他与return函数的区别
  10. 擎创技术流 | ClickHouse实用工具—ckman教程(15)