在IE死掉以后,ms-office是目前微軟尚存的ole automation軟件,其它的coreal draw和auto cad都紛紛轉(zhuǎn)向。
不管是前期還是后期綁定ole automation,都只能通過(guò)idispatch接口,而idispatch只有兩種數(shù)據(jù)類(lèi)型,一種是hResult(用來(lái)處理錯(cuò)誤),另一種是variant。所以不管vba有多少數(shù)據(jù)類(lèi)型,它調(diào)用office對(duì)象,只有一種數(shù)據(jù)類(lèi)型,那就是variant。
除了vb(vba),不管是c++,c#……都無(wú)法做到完全自動(dòng)轉(zhuǎn)換variant中的類(lèi)型,F(xiàn)B也不例化,variant絕對(duì)是一個(gè)很讓人頭疼的數(shù)據(jù)類(lèi)型。
idispatch接口,最常用的就是getidofNames和invoke方法。其中為了方便使用,一般把invoke方法進(jìn)行細(xì)分,
get方法用來(lái)獲取屬性值和子對(duì)象,
put方法用來(lái)設(shè)置屬性值,
set用于byref方式設(shè)置屬性值(所以vba中使用set語(yǔ)句用來(lái)賦值object對(duì)象,呵呵),
call方法用來(lái)調(diào)用對(duì)象的方法。
FB中處理com和ole的庫(kù)不少,有的很強(qiáng)大,有的比較簡(jiǎn)單,有的強(qiáng)調(diào)調(diào)用,有的強(qiáng)調(diào)不僅調(diào)用還強(qiáng)調(diào)能寫(xiě)activeX的dll和ocx。但都或多或少有點(diǎn)瑕疵,因?yàn)閭(gè)人的喜好不同,寫(xiě)出來(lái)的風(fēng)格不太一樣。
在這里,我就介紹其中的一種,這是vbrichclient作者為FB寫(xiě)的一個(gè)簡(jiǎn)單的vbvariant類(lèi)庫(kù)。
寫(xiě)一個(gè)簡(jiǎn)單的例子:
'==================================
#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 "調(diào)用成功"
sleep
'===================================

vbvariant類(lèi),有一個(gè)很遺憾的地方,就是它干脆不自動(dòng)處理variant的數(shù)據(jù)類(lèi)型,所以每一個(gè)參數(shù)值,都要指明數(shù)據(jù)類(lèi)型(b:表示boolean;s:表示string(ansii);w:表示wstring(unicode);c:表示currency;i:表示integer;I:表示long;f:表示single;D:表示double,t:表示datetime,v:表示variant)。
這讓人很不爽,當(dāng)然這是有改進(jìn)的空間的。