程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 如何在C++Builder中使用Delphi控件

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

編輯: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);

在OpenSample後你就可以使用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. 下一頁:
Copyright © 程式師世界 All Rights Reserved