如何在BCB中调用DELPHI的控件?

gfcyx 2001-08-16 10:59:34
如何在BCB中调用DELPHI的控件?
...全文
106 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nepalon 2001-08-16
  • 打赏
  • 举报
回复
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 的 制 作
在Delphi 中 新 建 一DLL 项 目SampleDLL , 时 在 此 项 目 中Create 一 个 新 的 类TTtempcomp 基 类 为TComponent 即 也 为 一 个 控 件, 在 其 中 加 入 一 个constructor Create1, 但 不 作 任 何 动 作;
在 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 类 似 的 组 件 形 式 使 得 产 品 在 同 一 产 品 时 代 保 持 一 定 的 互 用 性, 来 增 加 产 品 群 的 生 命 力
cx_octor 2001-08-16
  • 打赏
  • 举报
回复
报什么错误
gfcyx 2001-08-16
  • 打赏
  • 举报
回复
但在编译时,系统经常报错,不知道还需在哪个地方进行设置?
wangledong 2001-08-16
  • 打赏
  • 举报
回复
在component菜单中选install component安装.Pas就可以了
gfcyx 2001-08-16
  • 打赏
  • 举报
回复
拜读了楼上的转摘,但有没有更好的方法?
china_boy 2001-08-16
  • 打赏
  • 举报
回复
BCB那就好就这一点不是很。。。。,但我还是爱它

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧