VARIANT自动化技术.docx
《VARIANT自动化技术.docx》由会员分享,可在线阅读,更多相关《VARIANT自动化技术.docx(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Skyline开发中的VARIANT参数类型在二次开发中,无论是针对什么软件平台,甚或于在所有的软件开发活动中,人们都只在做一件事情:进行接口调用。用Win32 API写代码的人关注的是函数,写WinForm的人关注整套Framework的调用,针对Skyline做二次开发的我们则更关注COM接口的使用。 在这个过程中,调用规则是所有开发人员高度关注的。这里所说的调用规则主要包括:名称,参数,返回值。 Skyline中的调用规则有其一定的特殊性,因为Skyline提供了一整套COM自动化接口,调用的名称既可以是接口方法,也可以是DISPATCH ID,调用参数中又有几乎无处不在,却又令人无比陌
2、生的类型,大多数的返回值不是某个接口的对象指针,就是HRESULT类型。以上这些对于将整套系统架构在C/S之上的开发人员来说都会产生一定的困惑,无论你使用的是C+还是C#,或者别的什么开发语言,都无法回避这一点。也许使用C#进行二次开发会很方便,快速,但明白些内部机制,对程序出错后的debug是相当有益的。基于此,我计划介绍一下Skyline开发中的参数类型。随便翻翻Skyline的开发文档就会发现,除过那些普通不起眼的小角色以外(我指的是类似于double, long这样的常规类型),出镜率最高的当属VARIANT类型和BSTR类型了,这两种类型也是COM开发中的常见类型。在这篇文章中我会全
3、面介绍一下VARIANT类型,因此如果你不了解TE,可借此熟悉这一在COM相关开发中大量使用的数据类型。如果你是一名TE开发人员,那么你还会发现我的重点是解决一些开发中的问题,例如构造多维数组类型的VARIANT变量以及如何访问该变量的数据等等话题。在COM发展出来之后,虽然它标榜自己跨语言,分布式,但人们发现,这里所谓的跨语言仅仅是对那些含有指针机制的语言所说的,对于脚本类型的语言仍然无法使用,因此在COM的基础上又发展出了自动化(Automation),如何在各种类型的语言之间传递数据,或者说,各种开发语言如何以一套相同的调用规则去使用组件。这便是VARIANT类型应运而生的背景。因为它能
4、够存储任意类型的数据。在VS的开发工具内,在VARIANT类型上点击”go to definition”,可以看到它的原型。大致是这个样子:struct tagVARIANT VARTYPE vt; union short iVal; / VT_I2. long lVal; / VT_I4. float fltVal; / VT_R4. double dblVal; / VT_R8. DATE date; / VT_DATE. BSTR bstrVal; / VT_BSTR. short * piVal; / VT_BYREF|VT_I2. long * plVal; / VT_BYREF|V
5、T_I4. float * pfltVal; / VT_BYREF|VT_R4. double * pdblVal; / VT_BYREF|VT_R8. DATE * pdate; / VT_BYREF|VT_DATE. BSTR * pbstrVal; / VT_BYREF|VT_BSTR. ;可以看出,VARIANT是个结构体,该变量的类型保存在vt中,含有的不同类型的值保存在union中。我们注意到vt的类型是VARTYPE,这也是一个结构,借助开发工具,我们也能看到它的定义。例如long 是VT_I4,double 是VT_R8,long类型的指针是VT_BYREF与VT_I4的组合。
6、下面通过一个简短的程序来演示一下它的基本用法。#include#includeusing std:cout;using std:endl;int main() VARIANT v1; VariantInit(&v1); v1.vt = VT_R8; v1.dblVal = 0.0001; cout v1.dblVal endl; VariantClear(&v1); return 0;从程序中可以看到,VARIANT类型使用起来很麻烦,使用前要初始化,用完后还要清空,一不留神也许就会出现错误。如果有面向对象编程经验,也许你会将这个类型封装为一个类,在构造函数中调用VariantInit,在析构
7、函数中调用VaraiantClear进行清理。幸运的是,微软已经封装好了这样一个类:_variant_t,上述程序在使用了_variant_t类型后代码如下:#include#includeusing std:cout;using std:endl;int main() _variant_t v1 = 0.0001; cout v1.dblVal endl; return 0;有了_variant_t类型之后,我们就可以申请一个该类型的变量,甚至不用初始化,就可以作为参数使用,这篇文章中的代码就是一个很好的例子。有的时候,一些函数,比如CreatePolyline函数中需要一个VARIANT类
8、型,但得是一个数组。自动化技术中的数组使用的是SAFEARRAY,它同样是一个结构体,与普通数组最大的区别就是这种数组有”自我意识”,所谓的自我意识就是,它知道所保存数据的维度,知道数组大小,知道是否还在被使用(内部有引用计数),与VARIANT类型一样,也有一套函数作为SAFEARRAY的支撑操作存在着,下面我以一个小程序来演示如何构建一个数组类型的_variant_t变量。#include#include#includeusing std:cout;using std:endl;using std:vector;int main() vectorvec; for(int i = 1; i
9、11; i+) vec.push_back(i * 0.0001); SAFEARRAY* psa = NULL; SAFEARRAYBOUND rgsabound1; rgsabound0.lLbound = 0; rgsabound0.cElements = vec.size(); psa = SafeArrayCreate(VT_R8,1,rgsabound); for(long i = 0; i 10; i+) SafeArrayPutElement(psa,&i,reinterpret_cast(&veci); _variant_t va; va.vt = VT_ARRAY | VT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VARIANT 自动化 技术
限制150内