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

在C++Builder中使用Delphi控件

編輯:關於C++

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

三:參考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類似的組件形式使得產品在同一產品時代保持一定的互用性,來增加產品群的生命力.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved