DELPHI中如何編寫COM組件
元旦閑來(lái)無(wú)事,學(xué)習(xí)一下DELPHI怎樣編寫COM組件。結(jié)果一試才發(fā)現(xiàn)問(wèn)題多多,要么是找不到接口,要么是找不到方法。查了很多資料,發(fā)現(xiàn)說(shuō)的都不清楚?,F(xiàn)在把我所學(xué)到的和大家分享一下,希望新學(xué)的人能少走彎路
元旦閑來(lái)無(wú)事,學(xué)習(xí)一下DELPHI怎樣編寫COM組件。結(jié)果一試才發(fā)現(xiàn)問(wèn)題多多,要么是找不到接口,要么是找不到方法。查了很多資料,發(fā)現(xiàn)說(shuō)的都不清楚。現(xiàn)在把我所學(xué)到的和大家分享一下,希望新學(xué)的人能少走彎路。
什么是COM
COM是微軟定的一種組件編寫的規(guī)范,目的是為了實(shí)現(xiàn)組件的重用,不管你是用C、DELPHI、VB什么語(yǔ)言寫的,只要遵守這種規(guī)范就是COM組件,就能相互之間調(diào)用。那這個(gè)規(guī)范是什么呢,最簡(jiǎn)單的,就是按規(guī)定使用接口,微軟定了個(gè)IUnkown接口,只要實(shí)現(xiàn)了這個(gè)接口的類,就可以稱為COM組件。在此基礎(chǔ)上可以加上自己的接口,實(shí)現(xiàn)特定的功能,這就成了有用的COM組件了。
DELPHI中如何創(chuàng)建COM組件
兩個(gè)步驟:
(1)創(chuàng)建一個(gè)ActiveX Library,這是個(gè)DLL。
(2)創(chuàng)建一個(gè)COM Object或者Automation Object,二者選其一,這兩者都是COM組件,但是當(dāng)然還是有區(qū)別的,差在調(diào)用的方法上,這個(gè)后面再說(shuō)。
DELPHI中如何調(diào)用COM組件
兩種方法,分別是用接口來(lái)調(diào)和用名稱來(lái)調(diào),第一種適用于支持接口的語(yǔ)言,如C、DELPHI,VB就不行了,好處是速度快,因?yàn)椴挥酶鶕?jù)名稱去查找了,還有開(kāi)發(fā)時(shí)編譯器能檢查,缺點(diǎn)是要導(dǎo)入類型庫(kù)。第二種適用于所有的語(yǔ)言,好處是不用導(dǎo)入類型了,缺點(diǎn)是調(diào)用的速度慢,還有開(kāi)發(fā)時(shí)編譯器不檢查。
前面說(shuō)的COM Object只能通過(guò)第一種方法調(diào),Automation Object兩種方法都可以調(diào)。舉例如下:
我創(chuàng)建了一個(gè)ActiveX Library,名叫mylib。一個(gè)Automation Object,名叫myobj。并且編譯注冊(cè)過(guò)了。
用第一種方法調(diào)用時(shí),需要如下操作:在use里加上mylib_TLB類型庫(kù)(如果不是自己開(kāi)發(fā)的沒(méi)有TLB可以從DLL導(dǎo)入生成的),代碼是var myobj:Imyobj; myobj:;之后就可以用了。如果有興趣可以看看類型庫(kù)的代碼里,里調(diào)用了CreateComObject,這函數(shù)返回的是IUnkown接口,再用as操作轉(zhuǎn)成你需要的Imyobj接口。
用第二種方法不需要類型庫(kù)了,代碼是var myobj:variant; myobj:CreateOleObject('');之后就可以用了,這個(gè)方便吧。其實(shí)為了實(shí)現(xiàn)用名字調(diào)用,需要加上IDispatch接口,不過(guò)delphi都自動(dòng)給我們加好了,不用管直接用就行。