搜索
bottom↓
回复: 8

如何在C++Builder中使用Delphi控件

[复制链接]

出0入0汤圆

发表于 2006-2-6 20:25:09 | 显示全部楼层 |阅读模式
如何在C++Builder中使用Delphi控件



  Delphi的出现将一大批程序员带入了Windows下的可视化编程,为一些C&C++的死党程序员所羡慕、感叹。直到C++Builder的出现这些Programer才用到了梦寐以求的编程工具,也将一些不得已"投敌"到Delphi下的程序员又拉回到C++的怀抱。她正真将Windows下的可视化编程和面向对象编程语言有机的融合在一起。但是由于C++Builder面市时间较短固而可用的控件不多,而且控件的使用也只针对某一版本,相互之间的可互用性不好,除非你有SourceCode;对于Delphi就更不用说了,C++Builder根本不能用,当然如果你有SourceCode;那么你可以转写成C++Builder的控件,不过你还得经过n遍的Complie…m遍的Step&Go…最后可以了。

  Delphi拥有强大的控件群,如何使用这些控件一直苦恼着我们这些C++Builder的追随者,我通过一些项目的实践掌握了一些如何在C++Builder中使用Delphi控件的方法。我的使C++Builder使用DelphiVCL类库的方法基于Windows中较通用的DLL方式。在实际应用中找到了将VCL控件转化为DLL库,在C++Builder动态调用DLL。此法适用于非可视VCL控件。假令在Delphi中有一Sample控件,有属性Actived、Pro1、Pro2,欲将这个控件转到C++Builder中使用。

一:Delphi中DLL的制作

  在Delphi中新建一DLL项目SampleDLL,时在此项目中Create一个新的类TTtempcomp基类为TComponent即也为一个控件,在其中加入一个constructorCreate1,但不作任何动作;在DLL中加入要导出的属性的Function(Actived、Pro1、Pro2)&Create、Destroy的框架,Exports中加入导出的Function、Procdure名称;在DLL的主过程中对TTempcomp的实例temp1进行Create1,另外保存出口和设置ExitProc;在OpenSample的函数中加入HwCtrl:=Sample1.Create(temp1)对Sample进行实例化,对CloseSample和其它属性加入相应的语句;

二:C++Builder中DLL的使用

  将Delphi中生成的DLL用implib生成LIB文件加入C++Builder的工程文件;



  在头文件中加入

extern "C" __declspec(dllimport) bool _stdcall OpenSample(void);

extern "C" __declspec(dllimport) void _stdcall CloseSample(void);

extern "C" __declspec(dllimport) bool _stdcall Actived (void);

extern "C" __declspec(dllimport) int _stdcall Pro1 (void);

extern "C" __declspec(dllimport) int _stdcall Pro2 (void);



  在Ope mple后你就可以使用Delphi中的属性Actived、Pro1、Pro2

三:参考DLL Source如下:





library SampleDLL;

uses

SysUtils, Classes, Sample;

TYPE

TTempcomp = class(TComponent)

private

public

constructor Create1;

published

end;



var

Sample1 :Sample;

SaveExit :Pointer;

temp1 :TTempcomp;

constructor TTempcomp.Create1;

begin

// inherited Create(self);

end;

/==============================================

function OpenSample: Boolean; stdcall; export;

begin

HwCtrl:= Sample1.Create(temp1);

If Sample1.Actived then result:=true;

end;

procedure CloseSample; stdcall; export;





begin

   Sample1.Destroy;

end;





function Actived: Boolean; stdcall; export;







begin

   result:=Sample1.Actived;

end;







function Pro1: Interger; stdcall; export;







begin

result:= Sample1.Pro1;

end;





function Pro2: Interger; stdcall; export;





begin

result:= Sample1.Pro2;

end;





/==============================================

procedure libexit; far

begin





if Sample1.Actived =true then

Sample1.Destroy;

ExitProc:=SaveExit;

temp1.Destroy;



end;

exports

OpenSample,CloseSample,Actived ,Pro1,Pro2;

begin





temp1:=TTempcomp.Create1;

SaveExit:=ExitProc;

ExitProc:=@libexit;





end.







解释:

  因为VCL控件都继承于TComponent,TComponent的构造函数需要一个AOwner并且也是TComponent,VCL控件的Create、Destroy都由控件的拥有者来动作,也就是AOwner;所以我在此DLL中新设置了一个TTempcomp类继承于Tcomponent且性设置了一个constructor(构造函数)Create1,而实际构造时什么都不做,以次作为要Create的Aowner;其他还有一种办法就是用Application作为Aowner但是它是基于Tform的作出来的DLL太大;其实,Inprise(原Borland)尽可以象MicroSoft一样用一些象DCOM类似的组件形式使得产品在同一产品时代保持一定的互用性,来增加产品群的生命

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2006-2-16 09:32:47 | 显示全部楼层
好像 VCL 在Delphi和C++Builder中是通用的, 要做的只是在IDE里安装一下, 没必要绕到DLL吧.  个人认为, 用C++Builder不如用Delphi, 非用C++, 那就用VC.

出0入0汤圆

发表于 2006-2-16 17:23:33 | 显示全部楼层
Delphi的編譯速度是宇宙最快的!

出0入0汤圆

 楼主| 发表于 2006-2-17 19:29:01 | 显示全部楼层
bcb,你什么时候才能流行啊!!!

出0入0汤圆

发表于 2006-2-22 12:34:25 | 显示全部楼层
其实选择一门语言有时候最重要的不是它的性能

而是是否适合你~~~

我喜欢BCB,因为VB太罗嗦,VC太麻烦,delphi又不是C的风格需要适应

我是做电子的,偏重硬件,不会也不可能会去编写那些很大的软件工程,不做网络系统、不做复杂数据库,只是做做控制、接口、界面什么的,因此我选择了BCB

一句话,适合自己的就是最好的。

出0入0汤圆

发表于 2006-4-19 09:39:20 | 显示全部楼层
同意4楼:“一句话,适合自己的就是最好的。”哈哈。。。。。。

出0入0汤圆

发表于 2009-2-20 03:30:04 | 显示全部楼层
同意,我也在学BCB

出0入0汤圆

发表于 2009-2-20 08:39:10 | 显示全部楼层
哦,VC++学起来,痛苦。

出0入0汤圆

发表于 2009-2-20 11:26:20 | 显示全部楼层
同意4楼,之前自己也说过。做控制的用bcb很适合。就拿做串口通讯来讲,校验总是用的
uint8 CalcFCS( uint8 *msg_ptr, uint8 len )
{
        byte x;
        byte xorResult;

        xorResult = 0;

        for ( x = 0; x < len; x++, msg_ptr++ )
                xorResult = xorResult ^ *msg_ptr;

        return ( xorResult );
}
这样子的函数,写好一个,在bcb、下位机上都能用。关键模块函数通用,方便。至于VC、Delphi自己也能用,但不常用。看得懂就行,用好自己擅长的就行,好的软件是靠个人思维打创出来的,开发环境只是个工具。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 19:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表