VARIANT and VARIANTARG

是一个结构体。结构体中vt变量指明这个结构体封装的哪种类型。结构体重包含了一个Union。该联合体根据vt的类型不同而不同。比如:vt为VT_UI1代表联合体是unsigned char.

COleVariant

该类封装了VARIANT结构体。在OLE automation中使用。这个类是从VARIANT结构体派生的。所以在需要VARIANT类型做参数的地方使用COleVariant类型都可以。而且VARIANT结构体的数据成员是COleVariant类的可获取的数据成员。

SAFEARRAY

  SAFEARRAY的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元 素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的 值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。 SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。

  使用SafeArray的具体步骤:

  方法一:

  包装一个SafeArray:

  (1). 定义变量,如:

  VARIANT varChunk;

  SAFEARRAY *psa;

  SAFEARRAYBOUND rgsabound[1];

  (2). 创建SafeArray描述符:

  uIsRead=f.Read(bVal,ChunkSize);//read array from a file.

  if(uIsRead==0)break;

  rgsabound[0].cElements =uIsRead;

  rgsabound[0].lLbound = 0;

  psa = SafeArrayCreate(VT_UI1,1,rgsabound);

  (3). 放置数据元素到SafeArray:

  for(long index=0;index<uIsRead;index++)

  {

  if(FAILED(SafeArrayPutElement(psa,&index,&bVal)))

  ::MessageBox(NULL,"出毛病了。","提示",MB_OK | MB_ICONWARNING);

  }

  一个一个地放,挺麻烦的。

  (4). 封装到VARIANT内:

  varChunk.vt = VT_ARRAY|VT_UI1;

  varChunk.parray = psa;

  这样就可以将varChunk作为参数传送出去了。

  读取SafeArray中的数据的步骤:

  (1). 用SafeArrayGetElement一个一个地读

  BYTE buf[lIsRead];

  for(long index=0;index<lIsRead;index++)

  {

  ::SafeArrayGetElement(varChunk.parray,&index,buf+index);

  }

  就读到缓冲区buf里了。

  方法二:

  使用SafeArrayAccessData直接读写SafeArray的缓冲区:

  (1). 读缓冲区:

  BYTE *buf;

  SafeArrayAccessData(varChunk.parray, (void **)&buf);

  f.Write(buf,lIsRead);

  SafeArrayUnaccessData(varChunk.parray);

  (2). 写缓冲区:

  BYTE *buf;

  ::SafeArrayAccessData(psa, (void **)&buf);

  for(long index=0;index<uIsRead;index++)

  {

  buf=bVal;

  }

  ::SafeArrayUnaccessData(psa);

  varChunk.vt = VT_ARRAY|VT_UI1;

  varChunk.parray = psa;

  这种方法读写SafeArray都可以,它直接操纵SafeArray的数据缓冲区,比用SafeArrayGetElement和 SafeArrayPutElement速度快。特别适合于读取数据。但用完之后不要忘了调用::SafeArrayUnaccessData (psa),否则会出错的。

  如果SafeArray中存的是BSTR的二维数组,则代码如下:

  if(varChunk.vt = VT_ARRAY | VT_BSTR)

  {

  BSTR* buf;

  long LBound; // 数组下界

  long UBound; // 数组上界

  SafeArrayAccessData(varChunk.parray, (void **)&buf);

  SafeArrayGetLBound(varChunk.parray, 1, &LBound);

  SafeArrayGetUBound(varChunk.parray, 1, &UBound);

  for(long i = LBound; i < UBound; i ++)

  {

  CString str(buf);

  MessageBox(str);

  }

  SafeArrayUnaccessData(varChunk.parray);

  }

------------------------------------------------------------------------------------------------------------------------------

COleSafeArray

COleSafeArray类是用于处理任意类型和维数的数组的类。COleSafeArray是从OLE VARIANT结构派生而来的。OLE SAFEARRAY成员函数在可以通过COleSafeArray来访问,就象是特别为一维的字节数组所设计的一个成员函数集。

#include

请参阅:COleVariant, CRecordset, CDatabase

COleSafeArray类成员

构造 COleSafeArray 构造一个COleSafeArray对象

操作

Attach 给COleSafeArray对象以存在的VARIANT数组的控制

Clear 释放基VARIANT中的所有数据

Detach 将VARIANT数组从COleSafeArray对象中分离出来(这将使数据不会被释放)

Win32 API 包装 AccessData 获取一个指向数组数据的指针

AllocData 为数组分配内存

AllocDescriptor 为安全数组描述符分配内存

Copy 创建一个已存在的数组的拷贝

Create 创建一个安全数组

Destroy 销毁一个已经存在的数组

DestroyData 销毁一个安全数组中的数据

DestroyDescriptor 销毁一个安全数组的描述符

GetDim 返回数组的维数

GetElement 获取安全数组中的一个单一元素

GetElemSize 返回安全数组中一个元素的按字节表示的大小

GetLBound 返回一个安全数组任一维的下界

GetUBound 返回一个安全数组任一维的上界

Lock 增加一个数组的加锁计数,并将一个指向数组数据的指针放到数组描述符中

PtrOfIndex 返回一个指向被索引的元素的指针

PutElement 将一个单一的元素放入数组中

Redim 改变一个安全数组的最不重要(最右边)的边界

UnaccessData 减小一个数组的加锁计数,并使由AccessData获得的指针无效

Unlock 减小一个数组的加锁以使它能被释放或改变大小

一维数组操作 CreateOneDim 创建一个一维的COleSafeArray对象

GetOneDimSize 返回一个一维的COleSafeArray对象中的元素个数

ResizeOneDim 改变一个一维的COleSafeArray对象中的元素个数

操作 operator = 将一些值(包括SAFEARRAY,VARIANT,COleVariant,或COleSafeArray对象)拷贝到COleSafeArray对象中

operator == 比较两个不同的数组(SAFEARRAY,VARIANT,ColeVariant,或COleSafeArray对象)

operator

COleSafeArray::COleSafeArray

COleSafeArray();

COleSafeArray( const SAFEARRAY& saSrc, VARTYPE vtSrc );

COleSafeArray( LPCSAFEARRAY psaSrc, VARTYPE vtSrc );

COleSafeArray( const COleSafeArray& saSrc );

COleSafeArray( const VARIANT& varSrc );

COleSafeArray( LPCVARIANT pSrc );

COleSafeArray( const COleVariant& varSrc );

参数: saSrc 要被拷贝到新的COleSafeArray对象中去的已经存在的COleSafeArray对象或SAFEARRAY。

vtSrc 新的COleSafeArray对象的VARTYPE。

psaSrc 一个指向要被拷贝到新的COleSafeArray对象中去的SAFEARRAY的指针。

varSrc 要被拷贝到新的COleSafeArray对象中去的已经存在的VARIANT或者COleVariant。

pSrc 一个指向要被拷贝到新的COleSafeArray对象中去的VARIANT对象的指针。

说明:

所有这些构造函数都创建一个新的COleSafeArray对象。如果没有参数,则创建的是一个空的COleSafeArray对象(VT_EMPTY)。如果COleSafeArray是从另一个数组拷贝来的,并且这个数组的VARTYPE并不是完全确定的(一个COleSafeArray,COleVariant,或者VARIANT),则源数组中的VARTYPE被保留,并且不需要说明。如果COleSafeArray是从另一个数组拷贝而来,并且该数组的VARTYPE是不知道的,则VARTYPE必须用vtSrc参数来指定。

如果出错,则函数抛出一个CMemoryException或COleException。

请参阅:VariantCopy

-------------------------------------------------------------------------------------------------------------------------------

VARTYPE

An enumeration type used in VARIANT, TYPEDESC, OLE property sets, and safe arrays.

The enumeration constants listed in the following VARENUM section are valid in the vt field of a VARIANT structure.

typedef unsigned short VARTYPE;

enum VARENUM{

VT_EMPTY     = 0,     // Not specified.

VT_NULL      = 1,     // Null.

VT_I2        = 2,     // 2-byte signed int.

VT_I4        = 3,     // 4-byte signed int.

VT_R4        = 4,     // 4-byte real.

VT_R8        = 5,     // 8-byte real.

VT_CY        = 6,     // Currency.

VT_DATE      = 7,     // Date.

VT_BSTR      = 8,     // Binary string.

VT_DISPATCH = 9,     // IDispatch

VT_ERROR     = 10,    // Scodes.

VT_BOOL      = 11,    // Boolean; True=-1, False=0.

VT_VARIANT   = 12,    // VARIANT FAR*.

VT_UNKNOWN   = 13,    // IUnknown FAR*.

VT_UI1       = 17,    // Unsigned char.

// Other constants that are not valid in VARIANTs omitted here.

};

VT_RESERVED = (int) 0x8000

// By reference, a pointer to the data is passed.

VT_BYREF     = (int) 0x4000

VT_ARRAY     = (int) 0x2000   // A safe array of the data is passed.

转自http://liuzixue99.blog.163.com/blog/static/6084949620098273219958/

SAFEARRAY、COleSafeArray、VARTYPE相关推荐

  1. SAFEARRAY、COleSafeArray、VARTYPE(转)

    SAFEARRAY的主要目的是用于automation中的数组型参数的传递.因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray.实质上SafeArray就是将通常的数组增加一个 ...

  2. Cstring转LPWSTR/LPCWSTR..BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR、_bstr_t .

    //方法一  CString str=_T("TestStr");  USES_CONVERSION;  LPWSTR pwStr=new wchar_t[str.GetLengt ...

  3. BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR、_bstr_t

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Visu ...

  4. Go 学习笔记(13)— 指针定义、指针特点、空指针、指针数组、指向指针的指针、指针作为函数入参

    1. 复合数据类型 Go 语言基本的复合数据类型有指针.数组.切片.字典.通道.结构和接口等.格式如下: * pointerType // 指针类型, [n]elementType // 数组类型, ...

  5. BSTR 、LPCTSTR、CString附C语言串基本操作

    CString ,BSTR ,LPCTSTR之间关系和区别 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指 ...

  6. Delphi进行CAD二次开发教学(1)——基础学习:运行、新建、打开图形文件

    http://hi.baidu.com/piaoliuxia/blog/item/d61e03faed3bd18c9f514670.html 查看文章   [原创]Delphi进行CAD二次开发教学( ...

  7. CString、TCHAR*、char*转换 cstring与char *的转化(还包含很多种转换)

    stringbasicsystemdeletenulldate <1>CString 转化为 char* [cpp] view plaincopyprint? CString strDat ...

  8. 使用第三方SDK(如微信、qq、快看、头条等),调用接口405 Method Not Allowed

    使用第三方SDK(如微信.qq.快看.头条等),调用接口405 Method Not Allowed 错误描述:postman请求正常,但客户端调用后接口没有反应,但返回了405错误. 解决方法:第三 ...

  9. 什么是原码、反码、补码?什么是按位与?范围数字按位与!

    前言:学过计算机基础的大家都知道什么是二进制,什么是"与"运算,这里先给大家复习一下. 举一个简单的例子: 5的二进制表示是0101(补齐4位) 7的二进制表示是0111(补齐4位 ...

最新文章

  1. Go 分布式学习利器(7)-- 字符串
  2. ionic之点击放大图片
  3. C# 条件语句 if else 、 switch case 及练习题解析
  4. ICS汇编学习笔记——操作数寻址方式
  5. Python 下JSON的两种编解码方式实例解析
  6. 【无码专区13】最小公倍数(线段树)
  7. php基础知识填空题,比较基础的php面试题及答案填空题
  8. Ubuntu 20.10 每日构建镜像已经可以下载测试
  9. python串口连续数据_Python代码从串口连续接收可变数据
  10. centOS6.6网络设置
  11. 65. 布置行内脚本
  12. java导出excel_Java导出excel【复制粘贴直接用】
  13. ROS入门教程(一)
  14. 贴片电阻的功率与封装对照表
  15. Chrome 插件下载网站+6个实用插件推荐
  16. Cocoa设计模式(iOS常用设计模式) Cocoa Design Patterns
  17. 直播APP软件开发,直播系统开发的技术架构揭秘
  18. (一)C++游戏开发-本地存储-介绍
  19. axurerp出现错误报告_安装好axure8.1以后,打开直接报错退出
  20. Codeforces1144C(C题)Two Shuffled Sequences

热门文章

  1. python设置字符_python字符串操作
  2. 我用ChatGPT写2023高考语文作文(五):北京卷I
  3. 竹间智能好吗?以认知转型,提升客户洞察能力
  4. 阿里云OSS上传速度优化技巧
  5. 极点配置状态反馈控制器的设计--王俊伟
  6. 如何诱导 ChatGPT 露出真实面目?
  7. 7-6 求整数的位数及各位数字之和 (15 分)
  8. mac php oracle11g,Mac安装Oracle11g并使用Navicat连接
  9. 界面库RingSDK和金山开源KUI界面
  10. Guitar Pro新手教程