在IE死掉以后,ms-office是目前微软尚存的ole automation软件,其它的coreal draw和auto cad都纷纷转向。
不管是前期还是后期绑定ole automation,都只能通过idispatch接口,而idispatch只有两种数据类型,一种是hResult(用来处理错误),另一种是variant。所以不管vba有多少数据类型,它调用office对象,只有一种数据类型,那就是variant。
除了vb(vba),不管是c++,c#……都无法做到完全自动转换variant中的类型,FB也不例化,variant绝对是一个很让人头疼的数据类型。
idispatch接口,最常用的就是getidofNames和invoke方法。其中为了方便使用,一般把invoke方法进行细分,
get方法用来获取属性值和子对象,
put方法用来设置属性值,
set用于byref方式设置属性值(所以vba中使用set语句用来赋值object对象,呵呵),
call方法用来调用对象的方法。
FB中处理com和ole的库不少,有的很强大,有的比较简单,有的强调调用,有的强调不仅调用还强调能写activeX的dll和ocx。但都或多或少有点瑕疵,因为个人的喜好不同,写出来的风格不太一样。
在这里,我就介绍其中的一种,这是vbrichclient作者为FB写的一个简单的vbvariant类库。
写一个简单的例子:
'==================================
#include "simpleVariant.bi"
dim excelapp as vbVariant
excelapp=createobject("excel.application")
excelapp.put("visible","b","true")
excelApp.Get("workbooks").call("open","s","G:\Freebasic\FBtest\test.xls")
print "调用成功"
sleep
'===================================
vbvariant类,有一个很遗憾的地方,就是它干脆不自动处理variant的数据类型,所以每一个参数值,都要指明数据类型(b:表示boolean;s:表示string(ansii);w:表示wstring(unicode);c:表示currency;i:表示integer;I:表示long;f:表示single;D:表示double,t:表示datetime,v:表示variant)。
这让人很不爽,当然这是有改进的空间的。