Delphi编写COM+简介(转)

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

   (2) OleVariant是一种COM object兼容的Variant类型, 可以通用任何Ole Automation 类型, 他与CreateOleObject创建的idispatch兼容

1:Com+的编写:

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

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

    3:然后在View--->Library的对话框中增加方法 注意:如果参数为输出的话,则类型要是指针型,比如:Long * ,然后修改后面的参数in :out,ret

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

2:客户端调用的编写:

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

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

    第一种(推荐):如果是在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+应用程序包中,只需重复以上步骤即可。

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 错误 大致原因:轻舞肥羊 (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+对象 ???

转载于:https://www.cnblogs.com/railgunman/archive/2010/11/27/1889703.html

Delphi中实现VSSComm控件的COM操作指南 本文还有配套的精品资源,点击获取 简介:本文深入探讨如何在Delphi应用程序中操作COM组件,特别是VSSComm控件。VSSComm是Visual SourceSafe通信组件的简称,它让Delphi开发者能够实现与VSS版本控制系统的交互。文章详细介绍了安装组件、导入类型库、创建VSS连接、调用VSS方法、处理异常和释放资源等关键步骤,以指导开发者有效地利用VSSCo... 阅读详情

相关推荐

Ubuntu下用QEMU模拟运行OpenBMC

在调试过程中,安装了很多依赖库,具体没有记录。关于kvm,也没理清具体有什么作用。本文仅记录,用QEMU成功的将OpenBMC跑起来的过程,做备忘,也供大家参考。

Sunny的博客 1208

Delphi下的COM接口編程(ActiveX Library)

在較早的時候,我的博客里已經有關于COM編程的有關知識(http://hi.baidu.com/yueyun889/blog/item/53ad2c1208b6f950f919b8ee.html),不過相信對于大部分入門者,包括我,也很難看懂(其實,到現在我也沒有參透那篇文章,和我沒有認真研究有關吧...) 下面用一個具體的實例開看看如何實現的吧. 因為程序涉及ActiveX技術,那就先來看看

流年~~ 5007

delphi下COM+服务器代码调试的设置

以下设置的操作平台: 操作系统:WindowsXP,工发工具:delphi7。 一、操作系统COM+组件的设置 1.打开“组件服务”:   控制面板-->管理工具-->组件服务 2.找到要设置的COM+组件:   在“组件服务”窗口的“控制台根目录”,依“组件服务-->计算机-->我的电脑-->COM+应用程序-->你要调试的COM+应用程序”            3.关闭C

踏雪无痕 3133

合泰单片机HT32之keil5开发环境搭建(一)

1. 前言 这两天在准备合泰杯,但是总是感觉无从下手,因为合泰单片机的资料教程什么的非常少,不像stm32那样。而且听说要用合泰单片机的专用IDE,感觉当场被劝退了。后来经过查找资料,发现合泰单片机也有keil5的支持包,也就是说可以从库函数进行开发,不用从寄存器进行开发,但我找了好久,并没有找到教程,后来实在没办法,打算自己动手搭建环境,经过了大概两天的挣扎后,终于成功地搭建好了环境,也成功地点...

weixin_44713763的博客 8671

在 PyCharm 中使用 Copilot

此外,要在 PyCharm 中使用 GitHub Copilot,您必须有效订阅 Copilot。在 PyCharm 中安装 GitHub Copilot 后,您现在可以将其用作项目的扩展。此外,它很容易安装在不同的 IDE 平台上,您还可以为特定编程语言启用 GitHub 插件。此外,按照以下步骤,您可以轻松地在 PyCharm 中安装 GitHub Copilot。此外,在 IDE 上使用 GitHub Copilot 时,您可以使用一些快捷方式。

一览无遗 1万+

使用Delphi编写COM组件

第一章 在Delphi中使用接口 1.1 定义接口: 目的:什么是接口,以及和抽象类的关联以及不同点。 抽象类(备注理解接口最简单的方法) 永远不能创建一个抽象类的实例; 本身不能实现功能,依靠派生类实现; 接口 被申明为interface类型。接口名从字母I开始。类类型名从T开始。 所有的接口从IUnknown继承; 不能创建接口实例; 不能在接口中指定范围指示。所有的方法都是公有型(pub

qiume的专栏 5943

关于LIO-SAM编译时出现错误 /usr/bin/ld: 找不到 -lBoost::timer

关于LIO-SAM编译时出现错误: 下载LIO-SAM代码 进入LIO-SAM文件夹,通过以下代码编译: mkdir build cd build cmake .. make 报错: /usr/bin/ld: 找不到 -lBoost::timer collect2: error: ld returned 1 exit status CMakeFiles/lio_sam_imuPreintegration.dir/build.make:759: recipe for target 'devel/lib/li

wwtx的博客 3648

Delphi 7 调用C# 编写的com组件DLL

成功注册了导出到“SMUtilMed\bin\Debug\smutilmed.tlb”的程序集和类型库。查找regasm.exe,一般在.net的目录下,可以直接拷拷贝到生成DLL的目录,方便操作。运行 regasm /tlb:smutilmed.tlb smutilmed.dll。可以选择Create Unit,只生成单元文件并引入项目内,不用安装元件到面板上。运行 gacutil.exe gacutil -I XXXX.dll。生成的引入文件内,应该有对应的方法,如果没有,请检查C#内的各项定义。

bell的专栏 1564

k8s配置habor作为镜像地址之后,如果harbor中没有镜像,如何设置自动从阿里云官方镜像仓库下载

通过 Harbor 的远端仓库可以集中管理。如果你在上游设置了 image prefix 为 library,那么对外访问 harbor.your-domain.com/library/nginx:latest 就会被 Harbor 去上游拉取 registry.cn-hangzhou.aliyuncs.com/library/nginx:latest 并缓存。- 将集群中的镜像地址改为 Harbor 的域名,比如 harbor.your-domain.com/library/nginx:latest。

极客栈 429

如何理解下一代ERP 即:华为MetaERP

如何理解下一代ERP 即:华为MetaERP 华为的 MetaERP核心定位: 华为MetaERP是华为公司自主研发的下一代企业核心商业管理系统。它不仅仅是一个传统的ERP(企业资源规划)系统,更是一个面向未来、基于云原生、AI驱动、安全可信的企业核心管理平台。

金牌架构师 1144

Delphi创建COM组件并分别用Delphi和html调用该组件的简单实例

一、功能介绍及效果图 用delphi xe6 创建一个简单的COM组件,并分别测试了用delphi和HTML调用该组件的方法ShowWuXiaNames。效果图如下: 图一:在Windows中注册的COM组件 图二:Delphi调用COM组件...

longchanghua_enshi的专栏 3210

YOLOv12改进策略【Neck】| 使用CARAFE轻量级通用上采样算子

CARAFE内容感知的特征重新组合。

Limiiiing的博客 664

用Delphi 编写Com+的心得体会.

相关名词:  (1) idispatch是COM object的接口, 在Delphi中通常指一个OleObject.   (2) OleVariant是一种COM object兼容的Variant类型, 可以通用任何Ole Automation 类型, 他与CreateOleObject创建的idispatch兼容 1:Com+的编写:    1:File---->New---->Other..

1614

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Delphi COM

1、什么是COM          COM是微软定的一种组件编写的规范,目的是为了实现组件的重用,不管你是用C、DELPHI、VB什么语言写的,只要遵守这种规范就是COM组件,就能相互之间调用。 那这个规范是什么呢,最简单的,就是按规定使用接口,微软定了个IUnkown接口,只要实现了这个接口的类,就可以称为COM组件。在此基础上可以加上自己的接口,实现特定的功能,这就成了有用的COM组件了。

流年~~ 1367

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Delphi COM编程介绍(转)

转自http://www.cnblogs.com/abchjb/articles/461725.html 软件重用是业界追求的目标,人们一直希望能够像搭积木一样随意“装配”应用程序,组件对象就充当了积木的角色。所谓组件对象,实际上就是预定义好的、能完成一定功能的服务或接口。问题是,这些组件对象如何与应用程序、如何与其他组件对象共存并相互通信和交互?这就需要制定?个规范,...

378

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

delphi 编写的com 对象 用delphi 的调用实例

delphi 编写的com 对象 用delphi 的调用实例COM 对象与 前一篇文章的 PHP调用的COM为同一个对象,故不例出COM. procedure TForm1.Button4Click(Sender: TObject);var  myCounter, mReturn: variant;begin  myCounter := CreateOleObject(

潇湘博客 1090

COM程序编写入门

COM程序编写入门编写:李贤敏日期:2004-5-2名词解释:OLE: (Object linking and embedding对象的链接与嵌入)       使得服务器模块和客户模块通过标准的接口进行通讯。两个模块可以在同一台计算机或位于不同的计算机上,位置对用户来说是无关紧要的。服务器模块实现了一组接口,客户模块通过这组接口进行通讯。COM: (Component objec

1787

Delphi下的COM编程

     Delphi下的COM编程Delphi通过向导可以非常迅速和方便的直接建立实现COM对象的代码,但是整个COM实现的过程被完全的封装,甚至没有VCL那么结构清晰可见。一个没有C++下COM开发经验甚至没有接触过COM开发的Delphi程序员,也能够很容易的按照教程设计一个接口,但是,恐怕深入一想,连生成的代码代表何种意义,哪些能够定制都不清楚。前几期 “DELPHI下的C

zhystudy的专栏 964

Delphi 编写COM+组件的知识和样例

一、COM组件的基础知识介绍: 1、什么是COM          COM是微软定的一种组件编写的规范,目的是为了实现组件的重用,不管你是用C、DELPHI、VB什么语言写的,只要遵守这种规范就是COM组件,就能相互之间调用。那这个规范是什么呢,最简单的,就是按规定使用接口,微软定了个IUnkown接口,只要实现了这个接口的类,就可以称为COM组件。在此基础上可以加上自己的接口,实现特

crkres9527 5127

用Delphi 编写Com+的心得体会

相关名词:  (1) idispatch是COM object的接口, 在Delphi中通常指一个OleObject.   (2) OleVariant是一种COM object兼容的Variant类型, 可以通用任何Ole Automation 类型, 他与CreateOleObject创建的idispatch兼容 1:Com+的编写:    1:File---->New----

qiume的专栏 1119

DELPHI怎样编写COM组件

<br />元旦闲来无事,学习一下DELPHI怎样编写COM组件.结果一试才发现问题多多,要么是找不到接口,要么是找不到方法.查了很多资料,发现说的都不清楚.现在把我所学到的和大家分享一下,希望新学的人能少走弯路.<br />         1、什么是COM<br />         COM是微软定的一种组件编写的规范,目的是为了实现组件的重用,不管你是用C、DELPHI、VB什么语言写的,只要遵守这种规范就是COM组件,就能相互之间调用。那这个规范是什么呢,最简单的,就是按规定使用接口,微软定了个IU

期待下集是个可爱梦儿 871

在DELPHI程序中注册OLE/COM控件

在DELPHI程序中注册OLE/COM控件       在用DELPHI编写程序时,充分利用他人的成果无疑是一条捷径。我们用的控件有的是带源码     的PAS文件,有的是DCU/OBJ文件;而OLE/COM控件也是不可缺少的,由于OLE/COM     控件不仅可以由DELPHI开发,还可由VB、VC、PB等其它编程语言开发,因而它可以使我们的     DELPHI应用程序功能更为强大,例如用一

dainiao01的专栏 2313
上一篇: Delphi COM编程介绍(转)
下一篇: 从内存中加载并运行exe(两种方法)
aowo7144
博客等级 码龄10年 5粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值