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 类 似 的 组 件 形 式 使 得 产 品 在 同 一 产 品 时 代 保 持 一 定 的 互 用 性, 来 增 加 产 品 群 的 生 命 力.
阅读(165)
(责任编辑:城市网)