当前位置:天才代写 > tutorial > C语言/C++ 教程 > 在C++Builder中利用Delphi控件

在C++Builder中利用Delphi控件

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:466

副标题#e#

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的建造

1.在Delphi中新建一DLL项目SampleDLL,时在此项目中Create一个新的类TTtempcomp基类为TComponent即也为一个控件,在个中插手一个constructorCreate1,但不作任何行动;

2.在DLL中插手要导出的属性的Function(Actived、Pro1、Pro2)&Create、Destroy的框架,Exports中插手导出的Function、Procdure名称;

3.在DLL的主进程中对TTempcomp的实例temp1举办Create1,别的生存出口和配置ExitProc;

4.在OpenSample的函数中插手HwCtrl:=Sample1.Create(temp1)对Sample举办实例化,对CloseSample和其它属性插手相应的语句;

二:C++Builder中DLL的利用

1.将Delphi中生成的DLL用implib生成LIB文件插手C++Builder的工程文件;

2.在头文件中插手

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);
3.在OpenSample后你就可以利用Delphi中的属性Actived、Pro1、Pro2


#p#副标题#e#

三:参考DLLSource如下:

librarySampleDLL;
uses SysUtils,Classes,Sample;
TYPE
  TTempcomp=class(TComponent)
  private
  public
   constructorCreate1;
  published
end;
var
Sample1:Sample;
SaveExit:Pointer;
temp1:TTempcomp;
constructorTTempcomp.Create1;
begin
//inheritedCreate(self);
end;
/==============================================
functionOpenSample:Boolean;stdcall;export;
begin
  HwCtrl:=Sample1.Create(temp1);
  IfSample1.Activedthenresult:=true;
end;
procedureCloseSample;stdcall;export;
begin
  Sample1.Destroy;
end;
functionActived:Boolean;stdcall;export;
begin
  result:=Sample1.Actived;
end;
functionPro1:Interger;stdcall;export;
begin
  result:=Sample1.Pro1;
end;
functionPro2:Interger;stdcall;export;
begin
  result:=Sample1.Pro2;
end;
/==============================================
procedurelibexit;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而且也是Component,VCL控件的Create、Destroy都由控件的拥有者来行动,也就是AOwner;所以我在此DLL中新配置了一个TTempcomp类担任于Tcomponent且性配置了一个constructor(结构函数)Create1,而实际结构时什么都不做,以次作为要Create的Aowner;

其他尚有一种步伐就是用Application作为Aowner可是它是基于Tform的作出来的DLL太大;

其实,Inprise(原Borland)尽可以象MicroSoft一样用一些象DCOM雷同的组件形式使得产物在同一产物时代保持必然的互用性,来增加产物群的生命力.

 

    关键字:

天才代写-代写联系方式