[推薦]如何在C++Builder中使用Delphi控件 |
|
axsoft
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
如何在C Builder中使用Delphi控件2000-06-01 00:00:00‧ 施江傑‧不詳 資料來源:http://www.yesky.com/20000601/73083.shtml 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的制作 在Delphi中新建一DLL項目SampleDLL,時在此項目中Create一個新的類TTtempcomp基類為TComponent即也為一個控件,在其中加入一個constructorCreate1,但不作任何動作;在DLL中加入要導出的屬性的Function(Actived、Pro1、Pro2)&Create、Destroy的框架,Exports中加入導出的Function、Procdure名稱;在DLL的主過程中對TTempcomp的實例temp1進行Create1,另外保存出口和設置ExitProc;在OpenSample的函數中加入HwCtrl:=Sample1.Create(temp1)對Sample進行實例化,對CloseSample和其它屬性加入相應的語句; 二:C Builder中DLL的使用 將Delphi中生成的DLL用implib生成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);在Ope mple后你就可以使用Delphi中的屬性Actived、Pro1、Pro2 三:參考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:=@libexit; end.解釋: 因為VCL控件都繼承于TComponent,TComponent的構造函數需要一個AOwner並且也是TComponent,VCL控件的Create、Destroy都由控件的擁有者來動作,也就是AOwner;所以我在此DLL中新設置了一個TTempcomp類繼承于Tcomponent且性設置了一個constructor(構造函數)Create1,而實際構造時什麼都不做,以次作為要Create的Aowner;其他還有一種辦法就是用Application作為Aowner但是它是基于Tform的作出來的DLL太大;其實,Inprise(原Borland)盡可以象MicroSoft一樣用一些象DCOM類似的組件形式使得產品在同一產品時代保持一定的互用性,來增加產品群的生命力. ![]() |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |