中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
如何在C++Builder中使用Delphi控件
作者:施江杰 时间:2007-09-23 16:08 出处:51cto 责编:月夜寒箫
              摘要:如何在C++Builder中使用Delphi控件

使C++Builder使用DelphiVCL类库的方法基于Windows中较通用的DLL方式。在实际应用中找到了将

VCL
控件转化为DLL库,在C++Builder动态调用DLL。此法适用于非可视VCL控件。

假令在Delphi中有一Sample控件,有属性ActivedPro1Pro2,欲将这个控件转到C++Builder中使用。

 

一、DelphiDLL的制作

 

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

 

二、C++BuilderDLL的使用

 

Delphi中生成的DLLimplib生成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);

OpenSample后你就可以使用Delphi中的属性ActivedPro1Pro2

 

三、参考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
CloseSampleActived Pro1Pro2

begin

temp1:=TTempcomp.Create1


SaveExit:=ExitProc


ExitProc:=@libexit


end.

解释:

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有