频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

在C++Builder中使用Delphi控件

来源:vlan9.com 作者:施江杰 出处:巧巧读书 2007-12-11 进入讨论组

使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类似的组件形式使得产品在同一产品时代保持一定的互用性,来增加产品群的生命力.

   巧巧读书:http://www.qqread.com/bcb/e972918500.html

更多文章 更多内容请看C/C++技术专题专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
较早的文章:利用组件传送文件

较新的文章:自画菜单
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章