悬赏:DLL中怎样输出类?怎样继承DLL中的类?(200分)

  • 主题发起人 主题发起人 rss
  • 开始时间 开始时间
R

rss

Unregistered / Unconfirmed
GUEST, unregistred user!
问题的目的是:
Delphi有很多好的控件,C++Builder不能直接安装,可否将Delphi的控件作为类放在DLL中,再由C++Builder程序继承此类来使用.

如有实例通过愿再加200分奖励.
 
要在dll中用delphi的类是可以的,不过要自己写不少的代码,我劝你还是另想
办法,比如说,把vcl控件转成com控件等.
 
有感于论坛里简单问题太多,弄个难点的给高手玩玩.

其实这个问题并不太难,也不必写不少的代码......


 
DLL本身只能输出函数、方法等,是不能输出类型定义的。

类作为类型定义的一种,只能存在于Delphi内部,
编译后的可执行代码是不能引入类型定义的。

你想要继承类定义,比较好的方法是用包(Package),
将Delphi的源代码以包的形式编译后,在C++Builder上安装。
这种方法比较类似Pascal时代的TPL(Turbo Pascal Library)。
其实Borland自己也是这样共享VCL库的,C++Builder用的
就是Delphi的VCL库。
 
NO,
DLL肯定可以输出类,我记得有书介绍方法,是Delphi程序调用DLL中的类,
很简单,但具体我忘了,所以提问!
CBuilder一定也可以,不过由于语言的差异需要一些特殊的定义,本人就是
问这个.

不用包是当然的了,DLL可以修改而不用改调用程序,包不行(实际也行但麻烦)

用Cbuilder调Delphi的DLL中的类可以更有效的整合两个工具,很有意义的.


 
dll 中只能输出类的虚拟对象方法,所以我觉得不能从dll中派生,
从dll中输出参见:“Delphi3从入门到精通”一书
 
李颖所说的是正确的,标准DLL是不包括类的. 但是特殊的Dll(OCX,BPL)则另当别论.
依照编程规则, 即使你能够使用Dll的类, 你也必须在你的程序中包含类的说明文件.
最典型的使用DLL中的类的方法是使用Package.

Delphi的VCL可以全封不动地安装到BCB中去.
 
当然最标准DLL中不包括类,只有函数,但MFC的DLL就可以包括任何类,任意继承类,
Delphi生成的DLL也并不是最标准的DLL,我想肯定可以使用类.
记得有一本C++Builder的书描写了在Delphi中定义类,然后在MFC中使用的例子,
MFC都行啊.

"Delphi的VCL可以全封不动地安装到BCB中去."
是吗?

我手上的Delphi控件好多没有源码,只有BPL和DCU文件,是可以放到
CBuilder的控件面板上,但无法使用?

恳请赐教!
 
类是可以export的,这一点毫无疑问.但是,对C++编译器来说,
要import,就必须要头文件.没有头文件是不可能在C++编译器
里引用任何库的,包括动态连接库.所以,只有BPL和DCU的控件,
除非有工具可以从DCU编译出HPP(当然这个工具可以是人),否
则不可能在BCB中使用.

要export类其实很容易,在C++编译器中,好象只要在类的定义
前面加__export就可以了,与函数一样.不知道DELPHI的语法
如何.但看DELPHI的风格,似乎只要把要用的DCU塞到DLL的工
程,然后用export all就可以了.
 
记得早在 Borland C++ 4.0 的时候,我就做过 类在 DLL 中的输出,所以我知道
是完全可行的,包括所有的继承等。但在DELPHI中是否可行,如何实行,我就不知
道了。
但是,只要有这样的DLL,是可以根据它推导出整个类的公共和继承部份的接口的,
至少在BC40的时候,我就实现过,但在C++Builder中没做过,所以我就不太清楚
了。BC40是将类中的函数加在类名的后面实现的,所以一个函数名在DLL中输出时
非常长,具体如何翻译是可以试出来的,如果谁有时间的话。

Delphi 我就不知道了...
 
记得早在 Borland C++ 4.0 的时候,我就做过 类在 DLL 中的输出,所以我知道
是完全可行的,包括所有的继承等。但在DELPHI中是否可行,如何实行,我就不知
道了。
但是,只要有这样的DLL,是可以根据它推导出整个类的公共和继承部份的接口的,
至少在BC40的时候,我就实现过,但在C++Builder中没做过,所以我就不太清楚
了。BC40是将类中的函数加在类名的后面实现的,所以一个函数名在DLL中输出时
非常长,具体如何翻译是可以试出来的,如果谁有时间的话。

Delphi 我就不知道了...
 
请看此文章:


如何在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 类 似 的
组 件 形 式 使 得 产 品 在 同 一 产 品 时 代 保 持 一 定 的 互 用 性, 来 增 加 产 品 群 的 生 命 力.
 
请问rss,
这样的是类吗?只是类的函数封装吧!

那么,怎样在C++中创建这个类的多个实例呢?怎样在C++中派生出基于动态连接库
中的类的派生类呢?

如果把VCL做成DCOM,那就不需要VCL了,Delphi也就是VB了,COM是面向对象的吗?
 
要做到这些极其容易,不过非常抱歉的是我只知道在VC中如何做:
#ifdef IMPAPI
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllexport)
#endif
...
class ABC
{
...
DLLAPI void Test();
...
};
如果想全部输出
class DLL ABC
{
};
我特别建议使用后者并实现类自己的new,delete,new[],delete[],
原因是C runtime library(.lib)在.EXE和.DLL是两个实例。
这也是COM/OLE为何用自己的管理机制的根本原因。

 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部