Delphi编写ActiveX控件及程序中嵌入word方案
ActiveX控件编写
1.ActiveX控件由来
在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括
Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun
Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。
OCX代表"对象链接与嵌入控件"(OLE),这个技术是Microsoft提出的程序技术,用于处理桌面文件的
混合使用。现在COM的概念已经取代OLE的一部分,Microsoft也使用ActiveX控件代表组件对象。
组件的一大优点就是可以被大多数应用程序再使用(这些应用程序称为组件容器)。一个COM组件
(ActiveX控件)可由不同语言的开发工具开发,包括C++和Visual Basic或PowerBuilder,甚至一些技术性
语言如VBScript。
控件即组件,只不过一般包含界面元素,ActiveX是在internet发展起来以后,为了吸引人的眼球,对OLE的一个更名而已,只是名字上
的差别.一般把包含界面元素的组件称作控件.(因为包含界面,所有就比没有界面的组件在底层实现上多一些变化)。简单的说就
是AvtiveX控件是实现了特殊接口的COM组件
2.ActiveX组件包括如下几类:
1.自动化服务器:可以由其他应用程序编程驱动的组件。自动化服务器至少包括一个,也许是多个供其他应
用程序生成和连接的基于IDispatch的接口。自动化服务器 可以含有也可以没有用户界面(UI),这取决于
服务器的特性和功能。
2.自动化控制器:那些使用和操纵自动化服务器的应用程序。
3.控件:ActiveX控件等价于以前的OLE控件或OCX。一个典型的控件包括设计时和运行时的用户界面,唯
一的IDispatch接口定义控件的方法和属性,唯一的 IConnectionPoint接口用于控件可引发的事件。
4.文档:ActiveX文档,即以前所说的DocObject,表示一种不仅仅是简单控件或自动化服务器的对象。
ActiveX文档在结构上是对OLE链接和模型的扩展,并对其所在的容器具有更多控制权。一个最显著的变化
是菜单的显示方式。一个典型的OLE文档的 菜单会与容器菜单合并成一个新的集合,而ActiveX文档将替换
整个菜单系统,只表现出文档的特性而不是文档与容器共同的特性。
5.容器:ActiveX容器是一个可以作为自动化服务器、控件和文档宿主的应用程序
3.什么是COM组件:
COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。
COM组件是遵循COM规范编写的
COM组件是一些小的二进制可执行文件
COM组件可以给应用程序、操作系统以及其他组件提供服务
自定义的COM组件可以在运行时刻同其他组件连接起来构成某个应用程序
COM组件可以动态的插入或卸出应用
COM组件必须是动态链接的
COM组件必须隐藏(封装)其内部实现细节
COM组件必须将其实现的语言隐藏
COM组件必须以二进制的形式发布
COM组件必须可以在不妨碍已有用户的情况下被升级
COM组件可以透明的在网络上被重新分配位置
COM组件按照一种标准的方式来宣布它们的存在
想了解更多COM技术请产考:http://blog.donews.com/piaoger/archive/2004/09/21/105204.aspx
4.ActiveX控件有四种属性:
Stock:为每个控件提供的标准属性,如字体或颜色。
Ambient:围绕控件的环境属性——已被置入容器的属性。这些属性不能被修改,但控件可以使用它们调
整自己的属性。
Extended:这些是由容器处理的属性,一般包括大小和在屏幕上的位置。
Custom:由控件开发者添加的属性。
ActiveX控件的后缀名一般是OCX或DLL等,编译完完成后,Activex控件将被自动注册到系统中
ActiveX控件编写主要设计属性、方法、事件三种特性。
VC中对属性和方法的访问是通过函数完成的,事件则通过消息完成
5.容器和服务器程序
容器应用程序是可以嵌入或链接对象的应用程序。Word就是容器应用程序。
服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序。Excel就是服务器应用程序。
Word既是一个容器应用程序,又是一个服务器应用程序。
Active控件可以看成一个极小的服务器应用程序,他不能独立运行,他必须嵌入到容器当中和容器一起运行
ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分。ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32位应用编程接口(Win32 API)和组件对象模型的一系列扩充和增强,目标是把计算机桌面环境与因特网环境集成起来,同时保护在Windows技术中现有的开发投资。微软的 ActiveX技术根本上就是修改过的OCX技术,使它能够跨越Internet,主要是使用WWW来传递控件。
ActiveX控件可以被集成到很多支持ActiveX的应用当中去,或者直接用来扩展应用的功能,这些支持ActiveX的应用包括C++ Builder、Delphi、Visual dBASE、 Visual Basic、Visual C++、Internet Explorer、Netscape Navigator等。ActiveX控件还可以使用在因特网上,在网页上使用它来发布信息、处理与用户的交互,但是需要使用支持ActiveX的浏览器才能阅读这些网页。目前已经开发出来的ActiveX控件越来越多,由于ActiveX控件具有很好的特性,我们可以在编程的时候选择使用合适的控件来加快自己的应用开发。可以不夸张地说,ActiveX控件是Windows平台编程必不可少的法宝。Delphi作为Windows平台上最优秀的程序开发工具之一,为ActiveX控件的开发提供了强有力的支持,让您轻松地开发ActiveX控件。Delphi的开发者仅仅需要了解一些ActiveX控件的简单知识,就可以使用Delphi提供的工具来快速开发自己的 ActiveX控件。
要开发ActiveX控件,我们先得简单了解一下ActiveX控件的一些相关知识。在Delphi中,一个ActiveX控件由如下几个部分组成: VCL(可视化构件库)控件、属性、方法、事件,以及一个或者多个相关的类型库,其中每个部分都有各自的作用。在Delphi中,一个ActiveX控件是由一个或者多个VCL构件经过包装以后得到的。所以,要使用Delphi来开发ActiveX控件,必须先得开发出或者选择要进行包装的VCL构件。也正是由于这个原因,我们可以将Delphi里大量优秀的VCL构件包装成ActiveX控件,从而可以在别的不能够直接使用VCL构件的开发工具(如Visual Basic、Visual C++)里也能够使用到这些控件。但是,在Delphi里可以用来做ActiveX控件的VCL构件必须是TWinControl的后代。如果想用一个TGraphiControl的子类做ActiveX控件,在大多数情况下只需要把它的基类变为TCustomControl即可。有的VCL构件是被注册成非ActiveX控件的,例如EditControl,这些控件也不能做ActiveX控件。类型库包含了控件的类型定义信息,提供了比接口更多的详细信息,是控件向它的宿主程序提供服务信息的一种途径。类型库的目的是为其他应用和编程工具提供关于它包含的构件对象的信息。开发ActiveX控件时,Delphi把类型库信息存入一个.TLB文件中及一个对应的Pascal文件(.TLB文件的Pascal语言版本),编译时类型库将作为资源链入DLL或者EXE中。类型库的元素包括:(1)类型库信息:包括类型库的总体信息和特征、当前类型库引用的其他类型库;(2)构件类:代表整个ActiveX控件,包含了提供给客户应用的接口;(3)接口属性和方法、事件;(4)枚举类型:一种用作数据类型的相关常量,可以用在类型库的其他地方定义属性和方法。Delphi提供了一个类型库编辑器,用于观察或修改类型库,见图1,可以使用它来增加、修改、删除类型库的各种元素。从图1类型库的界面上可以看到,左边是一个树形结构,各种元素的成员作为子节点出现;右边是根据左边所选中的元素类型显示不同的页签,可以对该元素的一些属性进行编辑。VCL构件的属性、方法和事件自然就变成为ActiveX控件的属性、方法和事件。控件的属性,例如颜色、标签等;控件的方法是请求控件执行某些动作;事件则是控件给宿主程序的一个通知,发生了一些事情。ActiveX控件所带的属性页可以让控件的使用者查看和修改控件的属性。您可以把几个属性捆绑在一个属性页上,也可以只为一个属性提供一个属性页。
在Delphi当中把TStringGrid包装成一个ActiveX控件的过程如下:
首先,要启动ActiveX控件向导,选择File菜单里的New命令,在弹出的对话框里选择ActiveX页签,然后双击ActiveX Control图标即可。向导中的第一个域要求选择一个要进行包装的VCL构件,点击选择TStringGrid。其他几个域取缺省值即可,如果需要包含版本信息等其他信息,也可以选上。点击OK按钮,向导将生成一个Delphi的ActiveX控件开发项目 StringGridXControl1,包括以下几个的文件:
1. 一个ActiveX项目文件,包含了启动、初始化一个ActiveX控件所需要的代码。通常是不需要修改这个文件的。
2. 一个类型库文件(TLB扩展名),定义和实现了ActiveX控件向外所提供的接口、属性、方法和事件。Delphi专门为这个文件提供了一个Pascal版本的文件,而且自动维护这两个文件的一致性。
3. 一个ActiveX实现的文件,使用了Delphi ActiveX框架(DAX)定义和实现了这个ActiveX控件,具体实现类型库里定义的接口。这个文件是我们经常需要修改的。DAX是Delphi对ActiveX控件的COM规约的实现方式。
4. 如果选择了包括一个"关于"对话框的话,还有一个对应的对话框实现文件。
Delphi的ActiveX控件向导根据所包装的VCL构件的属性、方法和事件生成了ActiveX控件相应的属性、方法和事件。但是它没有把 VCL构件使用非OLE类型(如集合、数组等)的属性、方法和事件转换过去。例如,TStringGrid的Options属性是集合类型的, RowHeights是数组类型的,在控件向导所生成的属性中就没有这些属性。但是有时候偏偏这些属性、方法和事件是很重要的,这时就需要手工添加一些属性、方法和事件!
Delphi自动生成了把VCL构件包装成ActiveX控件所需的包装代码。我们为ActiveX控件增加新的属性、方法和事件的时候,只需要在接口方法的实现里把ActiveX控件的数据与VCL构件的数据联系起来,或者使用VCL构件的方法来完成ActiveX控件的行为,而基本上不需要关心编写一个ActiveX控件的具体细节,例如COM规约等。
摘自:http://blog.sina.com.cn/s/blog_3ec38a670100065b.html
http://nvercongming.iteye.com/blog/1313177
Delphi 编写COM+组件的知识和样例
一、COM组件的基础知识介绍:
1、什么是COM
COM是微软定的一种组件编写的规范,目的是为了实现组件的重用,不管你是用C、DELPHI、VB什么语言写的,只要遵守这种规范就是COM组件,就能相互之间调用。那这个规范是什么呢,最简单的,就是按规定使用接口,微软定了个IUnkown接口,只要实现了这个接口的类,就可以称为COM组件。在此基础上可以加上自己的接口,实现特定的功能,这就成了有用的COM组件了。
2、COM、DCOM、COM+
COM是一个基于二进制的标准。打个比方,我们用Delphi实现了一个对象,一般情况下,我们只能在Delphi来生成这个对象的实例并调用,而如果我们用Delphi实现了一个COM对象的话,我们可以用VC、VB或者其他任何一种支持COM对象的语言来生成实例和调用。反过来也一样,我们可以在Delphi中使用各种COM对象,而不用介意它是用什么语言编写的。COM提供了分布式COM对象的机制,形象地说你可以调用另一台机器中的COM对象。COM+则是MTS的一个升级,在COM的基础上进一步提供了事务处理和其他很多Pool技术。
2、DELPHI中如何创建COM组件(两个步骤)
(1)、创建一个ActiveX Library,这是个DLL;【ActiveX选项卡】
(2)、创建一个COM Object或者Automation Object,二者选其一,这两者都是COM组件,但是当然还是有区别的,差在调用的方法上,这个后面再说。【ActiveX选项卡】;
(创建了一个ActiveX Library,名叫mylib。一个Automation Object,名叫myobj。并且编译注册。)
注意:COM Object只能通过接口调用,Automation Object可以调接口或名称调用。
3、DELPHI中如何调用COM组件(两种方法调用),
第一种方法(用接口来调用)
适用于支持接口的语言,如C、DELPHI;VB就不行了,好处是速度快,因为不用根据名称去查找了,还有开发时编译器能检查,缺点是要导入类型库。
需要如下操作:
在use里加上mylib_TLB类型库(如果不是自己开发的没有TLB可以从DLL导入生成的),代码是var myobj:Imyobj;myobj=Comyobj.create();之后就可以用了。如果有兴趣可以看看类型库的代码里,Comyobj.create里调用了CreateComObject,这函数返回的是IUnkown接口,再用as操作转成你需要的Imyobj接口。
第二种方法(用名称来调用)
适用于所有的语言,好处是不用导入类型了,缺点是调用的速度慢,还有开发时编译器不检查。
用第二种方法不需要类型库了,代码是var myobj:variant;myobj=CreateOleObject('mylib.myobj');之后就可以用了,这个方便吧。其实为了实现用名字调用,需要加上IDispatch接口,不过delphi都自动给我们加好了,不用管直接用就行。
1>、idispatch是COM object的接口, 在Delphi中通常指一个OleObject.
2>、 OleVariant是一种COM object兼容的Variant类型, 可以通用任何Ole Automation 类型, 他与CreateOleObject创建的idispatch兼容 。
(COM组件的编写和COM+组件的编写差不多,所以只写COM+组件的编写情况)
二、COM+编写的具体实例:
1、Com+的编写:
1>、File---->New---->Other....---->ActiveX Library 标签下的 Transactional Object
2>、然后填写: CoClss Name :类的名字,比如:ComPlusThreading Modal :线程模式:Apartment 选项: Supports transactions
当建立COM+ 时选择的事务模式为Requires a Transaction, COM+会根据客户的的请求建立相应的事务,不仅仅是数据库,还会有系统资源等事务.成功SetComplete.回滚SetAbort. 选择Requires a Transaction表示当用户调用这个COM+组件时,COM+环境会为这个组件建立一个新的事务上下文,这和数据库的事务不是一回事。当你的COM+组件提交数据时如果出错,应该告诉事务上下文,只要调用COM+组件的SetAbort方法就可以。这样一来,处于同一个事务上下文的所有COM+组件都会Rollback。如果数据提交成功,应该调用SetComplete,不调用这个方法也可以,因为在默认情况下,COM+组件的事务状态设置为EnableCommite。当处于同一事务上下文的所有COM+组件对象都调用了SetComplete时,该事务上下文才会真正的向数据库提交数据。
3>、然后在View--->Library的对话框中增加方法 注意:如果参数为输出的话,则类型要是指针型,比如:Long * ,然后修改后面的参数in :out,ret
4>、最后完善增加的方法就ok了
2、客户端调用的编写:
1>、先倒入Com+的接口类型. Project --->import Type Library---->选中你编写的Com+的类型,然后选择:Create Unit
3、安装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+应用程序包中,只需重复以上步骤即可。
4、导出客户端组件包
导出客户端组件包指的是把已经注册的组件导出为.msi格式的文件,这些文件在客户端安装后,只会在客户端注册组件,而不会安装多余的文件。如果不在客户端注册组件,是不能调用位于服务器上的组件的(此指服务器和客户端分布在不同的机器上时)。
5、调试Com+程序 ---ok
1>、打开Windows中的组件管理,找到要调试的组件包,点右键,选择属性,在高级这页里选择调试选项,打勾; 然后在下面的调试路径中找到/processID:{xxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 复制出来
2>、在dephi中Run | Parameters… HOST APPLICATION 填入 {系统路径}\system32\dllhost.exe PARAMETERS 粘巾 /processID:{xxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
3>、很关键的一点:组件程序:project|option|linker|Include TD32 debug info 和Include remote debug symbols打勾
4>、启动delphi,运行要调试的Com+程序,设置断点,然后运行客户端程序即可进入到Com+断点.
5>、调试完后记得要在 Windows中的组件管理中的高级这页里调试选项勾去掉哟.
6、Com+需要注意的地方:
1>、客户机运行就会报 interface not supported 错误.大致原因: COM+的权限依赖于Windows的权限配置,在服务器需要有客户机的用户名和密码。 如果还不行,就在服务器上重新安装com+,重新导出.
2>、建立工程时,com+不能包含在工程组中.(我的实践)
3>、COM+不支持Oracle吗?在用事务的时候出错:Using Oracle with Microsoft Transaction Server and COM+
7、在Com+中添加远程数据模块
1>、File---->New---->Other....---->Multitier 标签 下的 Transactional Data Module
2>、然后在View--->Library的对话框中增加方法.
8、Com+中传递数组
1>、先定义数组:
type TDataRecord = record
A: Byte;
B: LongWord;
C: Word;
D: LongWord;
end;
2>、服务器端:
function GetData: OleVariant;
var
P: Pointer;
begin
VarClear(Result);//不知D5有没。
try
Result := VarArrayCreate([0, SizeOf(TDataType)], varByte);
P := VarArrayLock(Result); //Data: TDataType为你要传的记录类型
Move(Data, P^, SizeOf(TDataType)); // 把Data的值传给P指向的变体类型
finally
VarArrayUnLock(Result);
end;
end;
3>、客户端:
procedure GetFile(const FileName: string);
var
P: Pointer;
V: OleVariant;
Data: TDataType;
begin
FillChar(Data, SizeOf(Data), 0);
V := SocketConnection1.AppServer.GetData;
try
P := VarArrayLock(V);
Move(P^, Data, SizeOf(Data));
finally
VarArrayUnLock(V);
end;
end;
9、Com+中传递记录集
服务器端:
Uses ADOInt;
你可以将ADO的数据作为一个Variant类型的变量进行传送:adodataset1.RecordSet这是原生的ado数据
这是服务端的一个方法的代码:把CodeSet的类型改为Variant*[in,out]
function TADORec.getData: OleVariant;
begin
AdoDataSet1.Open;
result := adodataset1.RecordSet;
end;
//可以将ADO的数据作为一个Variant类型的变量进行传送:adodataset1.RecordSet这是原生的ado数据
客户端
uses adoint;
var
MyRecordset :_recordset;
begin
MyRecordset := IUnknown(CodeSet) as _recordset
End;
10、Com有需要研究和有疑问的地方:
1、Com+的模式:
2、到Com+的资源Pooling机制
3、用delphi6 开发Com+,用Neutral模式,尽量用Object Pooling,当然就是要无状态了,事务要尽量短,避免死锁,用ADO不要用BDE.Dbexpress等.
4、我的做法是,按功能划分组件,把查询和更新分为两个功能组件,因为查询不需要事务,所以只要支持事务就行了。更新一般需要事务。
5、COM+的事务属性 COM+的事务默认级别是序列 Read,而不是我们认为的commit Read,而且我们设置AdoConnection的隔离级是不管用的,只能强制用显式的SQL才能起效果。例如: 一个中间层COM :select * from a where py_code like 'S%' 继续下面有很多代码;另一个中间层COM: update a set py_code=py_code where py_code like 'B%'; 这时这个COM将会死锁等待,虽然改动的不是一个数据也会死锁 用Commit Read 或UnCommit Read不会建议: 所以被多个子系统更新或读的表,要在最后打开和更新,不要早。另外可以强制改变ADOCONNECTION的隔离级
6、Com+中如何进行事务处理? 在COM+中,如何使用SetComplete和SetAbort进行事务管理?SetComplete和SetAbort怎么能在客户端调用呢?这样肯定是不行的。要保证事务,就在服务器端声明一个专门保存的接口方法,例如:
procedure UpdateMyData(var AData1, AData2: OleVariant; var AMaxError, AErrorCount: Integer); begin
try
DataSetProvider1.Data := AData1;
DataSetProvider1.ApplyUpdate(AMaxError, AErrorCount);
DataSetProvider2.Data := AData2;
DataSetProvider2.ApplyUpdate(AMaxError, AErrorCount);
SetComplete;
except
SetAbort;
end;
end;
7、在组件管理器中的"事务列表"里也看不到事务(应该有事务的时候),怎么看?
8、Com+的两大研究:事务和 pooling
9、做一个提交用的COM+对象和一个协调用的COM+对象。
10、建议:多个DLL在一个包,一个DLL中的COM公用一个ADOCONNECTION
11、问题:我已经在Transactional Data Module的Pooled属性里面设置了True了,但是在Win2000的组件服务管理的"组件属性"的"激活"一栏里面,仍然无法打开"启用对象共用"的选项 --->您可以将线程模式设置为tmNeutral或者tmBoth都可以。
在Delphi中能实现远程调用的有DCOM或COM+,这两种方式实现起来非常的相似。DCOM属于旧版本的远程调用技术,非常实用,所提供的服务保存在应用程序工程中。COM+是新版本的远程调用技术,所提供的服务保存在动态库所在的工程中。
一、DCOM技术介绍:
1、DCOM的定义
DCOM(分布式的COM服务器):是指该服务器可以处在网络的别处,并且可通过网络非常简单和透明地激活。
一个进程外的服务器令客户和服务端的区分更明显。该类服务器作为一个独立的可执行(EXE)程序运行,因此处在一个私有的进程空间中。EXE服务器的启动和停止在Windows中服务管理器中进行(SCM)。COM接口的调用通过内部的进程通信技术来处理。服务器可以运行在本地的机器,或者在一个远程的计算机上。如果服务器在一个远程的计算机上,我们称它为"Distributed COM,分布式的COM",或者DCOM。
2、线程模式
1>、独立线程(apartment-threade):看成的单线程。
在独立线程中,多个服务器客户的方法调用在服务器端的COM对象中被串行化,也就是说,每个独立的方法调用完成后,才会开始下一个的方法调用。因此独立线程的COM对象天生就是线程安全的,
2>、自由线程(free-threaded):看成是多线程。
而自由线程的COM对象可同时在COM对象上有多个的方法调用执行。每个客户的方法调用都在一个不同的线程中运行。因此,在一个自由线程的COM对象中,你必须要注意多线程的问题,例如同步。
开始的时候你将更趋向于使用独立的线程,因为它更加简单,不过以后最好转向到自由线程,因为它有着更多的优点。
3、COM和DCOM的区别和联系
DCOM服务器与COM服务器没有区别,只是位于远程电脑上;
1>、COM/DCOM组件模型是一种平台独立、分布式、面向对象的系统,用于创建可相互作用的二进制软件组件。COM/DCOM是微软的OLE(复合文档)和ActiveX(可用于Internet的组件)以及许多其它技术的基础技术;
2>、COM/DCOM之所以被认为是一种二进制标准,是因为它是一种在应用程序被编译成二进制机器码之后才起作用的标准;
3>、COM/DCOM不是一种面向对象语言,它也不指定一个应用程序如何构造,它是一种标准,它指明一种组件模型和使组件之间能够相互操作的编程需求。COM/DCOM组件可以运行在单一进程、不同进程、甚至是远端机器;
4>、COM/DCOM组件可以通过许多编程语言来创建。许多面向对象语言,诸如C++,都提供可简化COM/DCOM组件实现的编程机制;
5>、COM/DCOM定义了一个COM/DCOM组件的核心实质。一般来说,一个软件组件由一组数据以及管理这些数据的函数构成。一个COM/DCOM组件是这样的一种软件组件,它专门通过一组或多组相关的函数存取组件数据。这些函数集合称为接口,而接口的函数称为方法。对COM/DCOM来说,它需要的唯一的调用接口方法的途径就是指向接口的指针;
6>、编译好的COM/DCOM组件是不能修改的,要增加新的功能只能由开发商对组件源码进行修改、更新,然后重新编译生成新的COM/DCOM组件;
4、DCOM服务器的配置:
DCOM的调用: 必须通过Proxy/Stub对象,并且是通过RPC协议; CoClass的CreateRemote方法(Create调用本地);
Proxy: 远程COM对象在应用程序执行中的影象(Image),封装应用程序的调用信息;
Stub:接受Proxy调用信息,再使用这些信息调用真正的DCOM对象;然后调用结果回传给Proxy,由Proxy回传给应用程序;
RPC(Remote Procedure Call): 通信协议,使用DCOM时必须激活;
SCM(Service control Manager):Windows服务管理器,管理EXE服务器的启动和停止
线程模型: 同COM的模型;独立模式和自由模式
工作后的能力培养一定是问题和实践驱动型的,而不是理论驱动实践的。实践驱动在问题解决后才能够有真正的验证标准,才可能进行实践活动的分析和总结,形成分析解决问题的方法用于下一次实践。没有问题,没有项目的实战往往很难培养独挡一面的能力,即时有再完备的理论基础也没有用。这也正是我们谈的工作要主动承担任务,并乐于帮助他人解决问题的原因,很多时候解决问题越多积累的经验越多。
Delphi 应用程序内嵌word几种方法的比较:
对几种方法的难易程度的判别
a.通过Delphi的控件TOleContainer 将Word嵌入
这是最简单的Ole嵌入,能够直接将Word文档调用,只需要使用ToleContainer.Run就可以将Word文档直接启动。且这样启动的Word文档与Delphi程序是一个整体(从界面上看),但是它存在不可克服的缺点,即不能通过Delphi控制Word文档,也就不能实现将灵活操纵Word的目的。
b.使用Delphi提供的Servers控件调用Word,使用Word的属性。
使用Delphi的Servers控件来操纵Word,在编程时Delphi能够实现代码提示,总体上看能够较好的实现Delphi对Word的控制,但是还有一些Word的功能不能在Delphi中调用(比如自己编写的VBA宏代码)。
且实现功能时本来在VBA代码中可选则参数在Delphi调用的时候必须添加,否则,连编译都不能通过。
这种方式启动的Word与Delphi程序分属两个窗体。此办法仅能作为一个参考。
c.通过真正的Com技术,将Office软件目录中文件MSWORD9.OLB中的类库全部导入Delphi中,利用Com技术编程,利用真正的Com技术,将MsWord9.OLD文件类库导入,然后利用Com技术进行使用。
整体上类似使用Delphi的Servers控件,稍微比Servers控件麻烦,优缺点与Servers控件相同。
d.使用CreateOleObject将启动Word,然后以Ole方式对Word进行控制。
这种办法是使用以CreateOleObjects方式调用Word,实际上还是Ole,但是这种方式能够真正做到完全控制Word文件,能够使用Word的所有属性,包括自己编写的VBA宏代码。
与Servers控件和com技术相比,本方法能够真正地使用Word的各种属性,和在VBA中编写自己的代码基本一样,可以缺省的代码也不需要使用。
本方式启动的Word与Delphi程序分属两个窗体。
缺点是使用本方法没有Delphi代码提示,所有异常处理均需要自己编写,可能编写时探索性知识比较多。