关于CString与VARIANT(CComVariant)之间的转化
一、VARIANT、CComVariant类与CString是什么:
CString是MFC定义的字符串类,VARIANT是COM标准为了使COM组件能够被各种语言使用(vc++、vb、java、python等)而规定的一种统一型变量。即VARIANT能够转化成载体语言规定的变量类型,载体语言的变量类型也可以转化成VARIANT类型。
CComVariant类对VARIANT进行了类封装,并提供了操作方法。实际保存数据的仍然是CComVariant类封装的VARIANT变量。
由于VARIANT实际上是一个Struct结构体,而实际上Struct结构体和Class是同一种数据类型,因此可以说CComVariant类是VARIANT的子类,因此两者赋值的方法是一样的(区别在于CComVariant封装了一些方法:复制,清空,删除变量,类型转化等)。
二、VARIANT、CComVariant类初始化:
初始化用法:
VARIANT var;
var.vt=VT_BSTR; //vt属性定义VARIANT类型
var.bstrVar=_T("test text");//bstrVar是VT_BSTR类型对应的存值变量
如上文,VARIANT赋值的方法是先确定变量的类型,然后给相应变量赋值,CComVariant类也可以这样初始化,也可以通过类构造函数初始化。
vt取值可以为:VT_I2,VT_I4,VT_R4,VT_R8,VT_BSTR等,分别表示short,long,float,double,BSTR,对应的值分别存在iVal,lVal,fltVal,dblVal,bstrVar中。
具体可查询VARIANT结构的规定。
参考文献:https://blog.csdn.net/tangaowen/article/details/6553305
三、相互转化:
1.CString转VARIANT(CComVariant):
CString str=_T("test");
VARIANT var;
var.vt=VT_BSTR;
var.vstrVar=_bstr_t(str);//用MFC的_bstr_t类将CString字符串变量str包装后赋值即可。
2.VARIANT转CString
CString CSelectDlg::VariantToCString(VARIANT var)
{
CString strValue;
_variant_t var_t;
_bstr_t bst_t;
time_t cur_time;
CTime time_value;
COleCurrency var_currency;
switch(var.vt)
{
case VT_EMPTY:
strValue=_T("");
break;
case VT_UI1:
rValue.Format("%d",var.bVal);
break;
case VT_I2:
strValue.Format("%d",var.iVal);
break;
case VT_I4:
strValue.Format("%d",var.lVal);
break;
case VT_R4:
strValue.Format("%f",var.fltVal);
break;
case VT_R8:
strValue.Format("%f",var.dblVal);
break;
case VT_CY:
var_currency=var;
strValue=var_currency.Format(0);
break;
case VT_BSTR:
var_t=var;
bst_t=var_t;
strValue.Format ("%s",(const char*)bst_t);
break;
case VT_NULL:
strValue=_T("");
break;
case VT_DATE:
cur_time = (long)var.date;
time_value=cur_time;
strValue=time_value.Format("%A,%B%d,%Y");
break;
case VT_BOOL:
strValue.Format("%d",var.boolVal );
break;
default:
strValue=_T("");
break;
}
return strValue;
- typedef struct tagVARIANT
- {
- VARTYPE vt; //存储数据类型
- unsigned short wReserved1;
- unsigned short wReserved2;
- unsigned short wReserved3;
- union
- {
- Byte bVal; // VT_UI1.
- Short iVal; // VT_I2.
- long lVal; // VT_I4.
- float fltVal; // VT_R4.
- double dblVal; // VT_R8.
- VARIANT_BOOL boolVal; // VT_BOOL.
- SCODE scode; // VT_ERROR.
- CY cyVal; // VT_CY.
- DATE date; // VT_DATE.
- BSTR bstrVal; // VT_BSTR.
- DECIMAL FAR* pdecVal // VT_BYREF|VT_DECIMAL.
- IUnknown FAR* punkVal; // VT_UNKNOWN.
- IDispatch FAR* pdispVal; // VT_DISPATCH.
- SAFEARRAY FAR* parray; // VT_ARRAY|*.
- Byte FAR* pbVal; // VT_BYREF|VT_UI1.
- short FAR* piVal; // VT_BYREF|VT_I2.
- long FAR* plVal; // VT_BYREF|VT_I4.
- float FAR* pfltVal; // VT_BYREF|VT_R4.
- double FAR* pdblVal; // VT_BYREF|VT_R8.
- VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.
- SCODE FAR* pscode; // VT_BYREF|VT_ERROR.
- CY FAR* pcyVal; // VT_BYREF|VT_CY.
- DATE FAR* pdate; // VT_BYREF|VT_DATE.
- BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.
- IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.
- IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
- SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.
- VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
- void FAR* byref; // Generic ByRef.
- char cVal; // VT_I1.
- unsigned short uiVal; // VT_UI2.
- unsigned long ulVal; // VT_UI4.
- int intVal; // VT_INT.
- unsigned int uintVal; // VT_UINT.
- char FAR * pcVal; // VT_BYREF|VT_I1.
- unsigned short FAR * puiVal; // VT_BYREF|VT_UI2.
- unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.
- int FAR * pintVal; // VT_BYREF|VT_INT.
- unsigned int FAR * puintVal; //VT_BYREF|VT_UINT.
- };
- };
关于CString与VARIANT(CComVariant)之间的转化的更多相关文章
- javascript中日期格式与时间戳之间的转化
日期格式与时间戳之间的转化 一:日期格式转化为时间戳 function timeTodate(date) { var new_str = date.replace(/:/g,'-'); new_str ...
- C#入门篇6-6:字符串操作 StringBiulder string char[]之间的转化
//StringBiulder string char[]之间的转化 public static void Fun3() { StringBuilder sb = new StringBuilder( ...
- Android中Bitmap, Drawable, Byte,ID之间的转化
Android中Bitmap, Drawable, Byte,ID之间的转化 1. Bitmap 转化为 byte ByteArrayOutputStream out = new ByteArray ...
- NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化
转载▼ 在iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类. 通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. ...
- 浅析mysql 共享表空间与独享表空间以及他们之间的转化
innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间.什么是共享表空间和独占表空间共 ...
- String和数字之间的转化
主要是JDK的代码,还是比较的经典,值得一看,例如: package alg; /** * @author zha 字符串之间的转化 */ public class Alg3StringToint { ...
- json对象和json字符串之间的转化
json对象和json字符串之间的转化 json字符串----->json对象 使用JSON.parse()函数 var jsonStr = '{"name":"z ...
- jQuery对象和DOM对象和字符串之间的转化
jQuery对象和DOM对象和字符串之间的转化 字符串---------->jQuery对象 $(HTML字符串): $('<div>我是祖国的一朵小花</div>') ...
- json与javabean之间的转化
接着上一个http://www.cnblogs.com/ya-qiang/p/9009134.html随笔,继续介绍json与java对象之间的转化 一.java普通对象和json字符串的互转 jav ...
随机推荐
- mysql 存储过程初探
使用存储过程好处在于: 1.隐藏敏感的算法,避免被正常的开发人员看到,把业务逻辑隐藏在数据库中,而非程序代码里 2.简化应用代码程序,放到数据库里肯定就对程序代码简化有好处了 3.不同的开发语言都可以 ...
- linux下nginx php配置redis
之前一直遇到,Module compiled with module API=20090626这个坑问题!!! NOTICE: PHP message: PHP Warning: PHP Star ...
- Android SQLite基本用法
SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLit ...
- c/c++的一些小知识点2
- Android Resources
Ref:Android开发最佳实践 Ref:Android高手速成--第一部分 个性化控件(View) Ref:Android高手速成--第二部分 工具库 Ref:Android高手速成--第三部分 ...
- 寻找第K大 网易2016实习研发工程师编程题
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2] ...
- linux.1:创建分区和文件系统
概述 使用 fdisk.gdisk 和 parted 创建和修改 MBR 和 GPT 分区在本教程中,学习磁盘分区和 Linux 文件系统相关内容,包括学习如何: 使用 mkfs 命令设置 ext2. ...
- parent
<?php class MyObject { function myMethod() { //标准功能 echo "Standard Functionality\n"; } ...
- 模仿jquery框架源码
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- samsung n143 brightness on linux mint
sudo vi /etc/default/grub Find the line which says GRUB_CMDLINE_LINUX="" enter acpi_backli ...