Delphi编写COM+简介(转)


  (1) idispatch是COM object的接口, 在Delphi中一般指一个OleObject.数据库

   (2) OleVariant是一种COM object兼容的Variant类型, 能够通用任何Ole Automation 类型, 他与CreateOleObject建立的idispatch兼容express

1:Com+的编写:数组

    1:File---->New---->Other....---->ActiveX Library 标签 下的 Transactional Object服务器

    2: 而后填写: CoClss Name :类的名字,好比:ComPlus Threading Modal :线程模式:Apartment 选项: Supports transactionsapp

    3:而后在View--->Library的对话框中增长方法 注意:若是参数为输出的话,则类型要是指针型,好比:Long * ,而后修改后面的参数in :out,ret分布式

    4:最后完善增长的方法就ok了ide

2:客户端调用的编写:工具

    1:先倒入Com+的接口类型. Project --->import Type Library---->选中你编写的Com+的类型,而后选择:Create Unitui

三、安装COM+组件有两种方式,spa

    第一种(推荐):若是是在IDE环境里,点击“Run->Install COM+ Objects”便可把打开的Active Library项目安装到COM+环境中,注意:若是打开的项目是 一个普通的Application项目,是不能被安装到COM+环境中的。 将要安装的com+打上勾,而后在application中有两个选项:install to existing application :表示你的com+安装在com服务器的哪一个组件包中, install to New application:表示将当前com+组件安装到一个新的组件包中.

    第二种办法:打开控制面板-> 管理工具->组件服务->计算机->个人电脑->COM+应用程序,在COM+应用程序的树项上点击 鼠标右键,选择“新建->应用程序”->建立一个空的应用程序,并为此应用程序命名,接下 来点击“下一步”直到结束便可。创建了空的COM+应用程序后,接下来就是把COM DLL安装 到COM+应用程序中了。在刚创建的空应用程序的树项中新建一个组件,选择“安装新组件”, 在打开文件对话框中选择要安装到COM+环境中的DLL文件,以后跟着向导作均可以了,要把 多个COM DLL安装到同一个COM+应用程序包中,只需重复以上步骤便可。

四、“导出客户端组件包”指的是把已经注册的组件导出为.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 错误 大体缘由:轻舞肥羊 (2004-05-09 11:00:01) 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+中传递数组

     先定义数组: type TDataRecord = record A: Byte; B: LongWord; C: Word; D: LongWord; end; 1:server: 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)); finally VarArrayUnLock(Result); end; end; 2:Client 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+中传递记录集 下面xeen 实验成功 uses ADOInt******************************************************************************************* 能够;你能够将ADO的数据做为一个Variant类型的变量进行传送:adodataset1.RecordSet这是原生的ado数据 这是服务端的一个方法的代码:把CodeSet的类型改成Variant*[in,out] function TADORec.getData: OleVariant; begin AdoDataSet1.Open; result := adodataset1.RecordSet; end; ************************************************************************************************************************ 客户端 uses adoint; var MyRecordset :_recordset; begin MyRecordset := IUnknown(CodeSet) as _recordset ************************************************************************************************************************** Com基本概念:

    1:COM是一个基于二进制的标准。打个比方,咱们用Delphi实现了一个对象,通常状况下,咱们只能在Delphi来生成这个对象的实例并调用,而若是咱们用Delphi实现了一个COM对象的话,咱们能够用VC、VB或者其余任何一种支持COM对象的语言来生成实例和调用。反过来也同样,咱们能够在Delphi中使用各类COM对象,而不用介意它是用什么语言编写的。COM提供了分布式COM对象的机制,形象地说你能够调用另外一台机器中的COM对象。COM+则是MTS的一个升级,在COM的基础上进一步提供了事务处理和其余不少Pool技术。

    2:线程模式:Apartment:多个线程服务.

    3:当创建Com+时选择的事务模式为Requires a Transaction,Com+会根据客户的的请求创建相应的事务,不只仅时数据库,还会有系统资源等事务.成功SetComplete.回滚SetAbort. 选择Requires a Transaction表示当用户调用这个COM+组件时,COM+环境会为这个组件创建一个新的事务上下文,这和数据库的事务不是一回事。当你的COM+组件提交数据时若是出错,应该告诉事务上下文,只要调用COM+组件的SetAbort方法就能够。这样一来,处于同一个事务上下文的全部COM+组件都会Rollback。若是数据提交成功,应该调用SetComplete,不调用这个方法也能够,由于在默认状况下,COM+组件的事务状态设置为EnableCommite。当处于同一事务上下文的全部COM+组件对象都调用了SetComplete时,该事务上下文才会真正的向数据库提交数据。

    4:SetAbort合SetComplete是否正确调用

    5:(阿朱) 建议:多个DLL在一个包,一个DLL中的COM公用一个ADOCONNECTION 6:问题:我已经在Transactional Data Module的Pooled属性里面设置了True了,可是在Win2000的组件服务管理的“组件属性”的“激活”一栏里面,仍然没法打开“启用对象共用”的选项 --->您能够将线程模式设置为tmNeutral或者tmBoth均可以。

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+对象 ???

相关文章
相关标签/搜索