Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18688889
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-31 13:45:50

Delphi的出现将一大批程序员带入了下的可视化编程,为一些C&C++的死党程序员所羡慕、感叹。直到C++Builder的出现这些Programer才用到了梦寐以求的编程工具,也将一些不得已"投敌"到Delphi下的程序员又拉回到C++的怀抱。她正真将下的可视化编程和面向对象编程语言有机的融合在一起。但是由于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类似的组件形式使得产品在同一产品时代保持一定的互用性,来增加产品群的生命力.

阅读(340) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~