Delphi創建COM組件並分別用Delphi和html調用該組件的簡單實例

一、功能介紹及效果圖

用delphi xe6 創建一個簡單的COM組件,並分別測試了用delphi和HTML調用該組件的方法ShowWuXiaNames。效果圖如下:

                                圖一:在Windows中註冊的COM組件

 

                                     圖二:Delphi調用COM組件

 

                                   圖三:在HTML中調用delphi編寫的COM組件

 

二、COM基礎知識介紹

1、COM的概念

就如一輛汽車是由軸承、車輪等很多部件組合而成,一個軟件應用系統也可以由各個功能模塊組成,COM組件便是其中一種實現方式,而COM(Component Object Model,組件對象模型)是微軟定的一種組件編寫的規範,,它是一種平臺無關、語言中立、位置透明、支持網絡的中間件技術,即不管你是用C、DELPHI、VB什麼語言寫的,只要遵守這種規範就是COM組件,就能相互之間調用。那這個規範是什麼呢,最簡單的,就是按規定使用接口,微軟定了個IUnkown接口,只要實現了這個接口的類,就可以稱爲COM組件。在此基礎上可以加上自己的接口,實現特定的功能,這就成了有用的COM組件了。

DCOM是分佈式COM;COM+不僅繼承了COM所有的優點,而且還增加了一些服務,比如隊列服務、負載平衡、內存數據庫、事件服務等。

 

2、Delphi中創建COM組件

(1)創建一個ActiveX Library,這是個DLL;【ActiveX選項卡】

(2)創建一個COM Object或者Automation Object,二者選其一,這兩者都是COM組件,但是當然還是有區別的,差在調用的方法上,COM Object只能通過接口調用,Automation Object可以調接口或名稱調用。【ActiveX選項卡】

 

3、Delphi中調用COM組件

第一種方法(用接口來調用)
        適用於支持接口的語言,如C、DELPHI;優點是速度快,因爲不用根據名稱去查找了,還有開發時編譯器能檢查,缺點是要導入類型庫。需要如下操作:

在use里加上ComTestData_TLB類型庫(如果不是自己開發的沒有TLB可以從DLL導入生成的),代碼是

        var myCoWuXia: ICoWuXia;
        myCoWuXia := CoCoWuXia.Create();  //通過接口創建COM對象
        ShowMessage(myCoWuXia.ShowWuXiaNames);

如果有興趣可以看看類型庫的代碼裏,CoCoWuXia.Create()裏調用了CreateComObject,這函數返回的是IUnkown接口,再用as操作轉成你需要的ICoWuXia接口。

 

第二種方法(用名稱來調用)
        適用於所有的語言,好處是不用導入類型,缺點是調用的速度慢,還有開發時編譯器不檢查。代碼是

        var myCoWuXia: Variant;
        myCoWuXia := CreateOleObject('ComTestData.CoWuXia');  //通過名稱創建COM對象
        ShowMessage(myCoWuXia.ShowWuXiaNames);

其實爲了實現用名字調用,需要加上IDispatch接口,不過delphi都自動給我們加好了,不用管直接用就行。

(1)、 idispatch是COM object的接口, 在Delphi中通常指一個OleObject.

(2)、 OleVariant是一種COM object兼容的Variant類型, 可以通用任何Ole Automation 類型, 他與CreateOleObject創建的idispatch兼容 。

 

三、COM+組件編寫實例

1、Delphi創建COM+

(1)File->New->Other->ActiveX->ActiveX Library

(2)File->New->Other->ActiveX->Automation Object。填寫CoClss Name:類的名字;Threading Modal (線程式):Apartment (Supports transactions)

(3)添加屬性、方法

注意:如果參數爲輸出的話,則類型要是指針型,比如:Long * ,然後修改後面的參數in爲[out, retval]

(4)在對應單元中完成方法的具體實現過程

 

2、安裝COM+組件

(1)第一種(推薦):如果是在IDE環境裏,點擊“Run->Install COM+ Objects”即可把打開的Active Library項目安裝到COM+環境中,注意:如果打開的項目是 一個普通的Application項目,是不能被安裝到COM+環境中的。 將要安裝的com+打上勾,然後在application中有兩個選項:install to existing application :表示你的com+安裝在com服務器的哪個組件包中, install to New application:表示將當前com+組件安裝到一個新的組件包中.

 (2)第二種辦法:打開控制面板-> 管理工具->組件服務->計算機->我的電腦->COM+應用程序,在COM+應用程序的樹項上點擊 鼠標右鍵,選擇“新建->應用程序”->創建一個空的應用程序,併爲此應用程序命名,接下來點擊“下一步”直到結束即可。建立了空的COM+應用程序後,接下來就是把COM DLL安裝 到COM+應用程序中了。在剛建立的空應用程序的樹項中新建一個組件,選擇“安裝新組件”, 在打開文件對話框中選擇要安裝到COM+環境中的DLL文件,之後跟着嚮導做都可以了,要把多個COM DLL安裝到同一個COM+應用程序包中,只需重複以上步驟即可。

2、Delphi調用COM+

(1)Component->Import Component,引入ComTestData_TLB單元

(2)寫代碼

procedure TForm1.Button1Click(Sender: TObject);
var
  myCoWuXia: ICoWuXia;
begin
  myCoWuXia := CoCoWuXia.Create();
  showmessage(myCoWuXia.ShowWuXiaNames);
end;

 

注意:如果使用名稱調用COM+組件,則不需要導入ComTestData_TLB類型庫,代碼如下:

procedure TForm1.Button2Click(Sender: TObject);
var
  myCoWuXia: Variant;
begin
  myCoWuXia := CreateOleObject('ComTestData.CoWuXia');
  showmessage(myCoWuXia.ShowWuXiaNames);
end;

 

3、HTML調用COM+

因爲COM組件與調用的語言無關,所以可以在HTML中調用上述組件。

<html>
    <head>
        <title>ActiveX Test Page</title>
    </head>
    
    <body>
        <H1>ActiveX Test Page</H1><hr>
        <script>
            var xml=new ActiveXObject("ComTestData.CoWuXia"); // 通過名稱創建COM對象
            var str=xml.ShowWuXiaNames();  //從com組件返回字符串  
            document.write("從Com組件CoWuXia中獲取字符串:"+str);
        </script>
    </body>
</html>

注意:ActiveXObject是IE瀏覽器獨有的對象,只有用IE瀏覽器才能使用

備註:該文章參考了https://blog.csdn.net/zang141588761/article/details/51247797

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章