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

页面导航:首页 > 软件编程 > Delphi > 如何在C++Builder中使用Delphi控件

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

来源: 作者: 时间:2016-02-05 11:47 【

使C++Builder使用DelphiVCL类库的方法基于Windows中较通用的DLL方式。在实际应用中找到了将VCL控件转化为DLL库,在C++Builder动态调用DLL。此法适用于非可视VCL控件。假令在Delphi中有一Sample控件

 

使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,CloseSample,Actived ,Pro1,Pro2;
            begin
            temp1:=TTempcomp.Create1;
            SaveExit:=ExitProc;
            ExitProc:[email protected];
            end.

解释:
因为VCL控件都继承于TComponentTComponent的构造函数需要一个AOwner并且也是TComponentVCL控件的CreateDestroy都由控件的拥有者来动作,也就是AOwner;所以我在此DLL中新设置了一个TTempcomp类继承于Tcomponent且性设置了一个constructor(构造函数)Create1,而实际构造时什么都不做,以次作为要CreateAowner

Tags:

相关文章

    文章评论

    最 近 更 新
    热 点 排 行
    Js与CSS工具
    代码转换工具
    
    <