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.youkuaiyun.com/zang141588761/article/details/51247797

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值