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

翻译|其它|编辑:郝浩|2004-02-08 13:13:00.000|阅读 1434 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

Delphi 的 出 现 将 一 大 批 程 序 员 带 入 了Windows 下 的 可 视 化 编 程, 为 一 些C&C++ 的 死 党 程 序 员 所 羡 慕、 感 叹。 直 到C++Builder 的 出 现 这 些Programer 才 用 到 了 梦 寐 以 求 的 编 程 工 具, 也 将 一 些 不 得 已" 投 敌" 到Delphi 下 的 程 序 员 又 拉 回 到C++ 的 怀 抱。 她 正 真 将Windows 下 的 可 视 化 编 程 和 面 向 对 象 编 程 语 言 有 机 的 融 合 在 一 起。 但 是 由 于C++Builder 面 市 时 间 较 短 固 而 可 用 的 控 件 不 多, 而 且 控 件 的 使 用 也 只 针 对 某 一 版 本, 相 互 之 间 的 可 互 用 性 不 好, 除 非 你 有Source Code; 对 于Delphi 就 更 不 用 说 了,C++Builder 根 本 不 能 用, 当 然 如 果 你 有Source Code 那 么 你 可 以 转 写 成C++Builder 的 控 件, 不 过 你 还 得 经 过n 遍 的Complie …m 遍 的Step&Go … 最 后 ※ ☆ ▲ # \ ↓。

---- Delphi 拥 有 强 大 的 控 件 群, 如 何 使 用 这 些 控 件 一 直 苦 恼 着 我 们 这 些C++Builder 的 追 随 者, 我 通 过 一 些 项 目 的 实 践 掌 握 了 一 些 如 何 在C++Builder 中 使 用Delphi 控 件 的 方 法。

---- 我 的 使C++Builder 使 用Delphi VCL 类 库 的 方 法 基 于Windows 中 较 通 用 的DLL 方 式。 在 实 际 应 用 中 找 到 了 将VCL 控 件 转 化 为DLL 库, 在C++Builder 动 态 调 用DLL。 此 法 适 用 于 非 可 视VCL 控 件。

---- 假 令 在Delphi 中 有 一Sample 控 件, 有 属 性Actived、Pro1、Pro2, 欲 将 这 个 控 件 转 到C++Builder 中 使 用。

一:Delphi 中DLL 的 制 作

  1. 在Delphi 中 新 建 一DLL 项 目SampleDLL , 时 在 此 项 目 中Create 一 个 新 的 类Tttempcomp 基 类 为Tcomponent 即 也 为 一 个 控 件, 在 其 中 加 入 一 个constructor Create1, 但 不 作 任 何 动 作;
  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

三: 参 考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 类 似 的 组 件 形 式 使 得 产 品 在 同 一 产 品 时 代 保 持 一 定 的 互 用 性, 来 增 加 产 品 群 的 生 命 力.


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP