副标题#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雷同的组件形式使得产物在同一产物时代保持必然的互用性,来增加产物群的生命力.