如何从DLL中导出类以及利用这个类创建类的实体?

dywapple 2005-11-03 11:29:29
我自己编写一些DLL,然后利用接口导出DLL中包含的一些类,并用这些类创建类的实体,请问这可不可以实现?以及如何实现?

谢谢。
...全文
286 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
linzhengqun 2005-11-04
  • 打赏
  • 举报
回复
这个方法是行不通的,因为你的类定义在DLL中啊,你的程序怎么知道它有什么方法,即使你用GetClass取得TpersistClass,但你能用它干什么事呢,顶多就是创建这个对象,但什么也做不了。

你应该做的就是将接口声明单元给DLL和你的程序共用。让你的类实现其中的接口。而主程序用接口来操作DLL中的类。就这样。

在DLL中应该有一个导出函数比如
procedure CreateObj: IYourObj //返回接口类型
begin
Result := TYouObj.Create;//创建类实例
end;

而在你的主程序中则声明
YouObj: IYouObj;//声明接口
begin
YouObj := CreateObj; //取得对象
你就可以操作这个类了。
end;
仙侣步惊云 2005-11-04
  • 打赏
  • 举报
回复
其实我介绍的方法还是有用的:
我说过,定义类引用时要尽可能接近你的自定义类,比如用你的dll中的类继承自TForm,则上面的程序可改为:
在dll文件所在单元的initialization写如下代码:
RegisterClass(AClass: TMycalss);//注册你的类
然后在主控程序写如下代码:
type
TMyProc:procedure(Sender: TObject)of Object;//方法指针类型
var
dllHandle:HMODULE;
MyClassRef:class of TForm;
MyForm:TForm;
MyMethod:TMethod;//方法结构
MyProc:TMyProc//方法指针
begin
dllHandle:=LoadLibrary('mydll.dll');//装入dll到内存
MyClassRef:=TForm(GetClass('MyClass'));//在内存中找到已经注册的类并用指针保存
MyForm:=MyClassRef.create;//创建类实例
TEdit(MyForm.FindComponent('Edit1')).Text:='这是从主控程序修改的文本';//假定你在
dll//中定义的窗口类有一个Edit控件,现设置其文本内容
MyMethod.Code:=MyClassRef.MethodAddress('Button1Click');//假定窗口类中有一个Button1//的按钮并写了相应代码,现将方法地址传给MyMethod结构
MyMethod.Data:=MyForm;
MyProc:=TMyProc(MyMethod);
MyProc(nil);//调用导出类的Button1Click方法

end;
dywapple 2005-11-04
  • 打赏
  • 举报
回复
to linzhengqun(风。我回来了)
十分感谢你的回复。
我用delphi时间不长,对delphi了解也不多,你能不能给我一个具体的例子,最好是源代码和注释都齐全的。
谢谢。
linzhengqun 2005-11-04
  • 打赏
  • 举报
回复
作为同一种语言的编程,要分模块,首推BPL。
仙侣步惊云 2005-11-04
  • 打赏
  • 举报
回复
导出的类确定工作起来有一定问题,但如果把dll换成bpl则一定问题也没有,就好象在一个模块工作一样,其实bpl是一种非常先进的技术.
linzhengqun 2005-11-04
  • 打赏
  • 举报
回复
http://www.123xz.net/article/article_20421_1.html
dywapple 2005-11-03
  • 打赏
  • 举报
回复
to sxqwhxq(步青云)
谢谢你的指点。
我现在可以用RegisterClass('MyClass')注册一个类,然后用GetClass('MyClass')
导出这个类,且可以用ShowMessage((GetClass('MyClass')).ClassName)来显示导出的类,但是我还是无法利用这个导出的类创建实例,也不能从DLL中导出类,请问这是什么问题?
谢谢。
dywapple 2005-11-03
  • 打赏
  • 举报
回复
谢谢大家的赏脸。

请问哪位有刘艺的《Delphi面向对象编程思想》,告诉我连接地址或者通过QQ发送给我均可。
小弟十分感谢。
QQ:3890637
dywapple 2005-11-03
  • 打赏
  • 举报
回复
to sxqwhxq(步青云)
十分感谢步青云老兄的帮助。
你能不能编写一个最简单的实现例子发给我?
直接将代码加说明发到我邮箱或者贴在这里。
我的邮箱:dywapple@tom.com
QQ:3890637

谢谢
仙侣步惊云 2005-11-03
  • 打赏
  • 举报
回复
在dll文件所在单元的initialization写如下代码:
RegisterClass(AClass: TMycalss);//注册你的类
然后在主控程序写如下代码:
var
dllHandle:HMODULE;
MyClassRef:TPersistentClass;//尽可能靠近你的父类,如TForm可用class of TForm
begin
dllHandle:=LoadLibrary('mydll.dll');//装入dll到内存
MyClassRef:=GetClass('MyClass');//在内存中找到已经注册的类并用指针保存
coreblood 2005-11-03
  • 打赏
  • 举报
回复
刘艺 《面向对象编程思想》 里面有
linzhengqun 2005-11-03
  • 打赏
  • 举报
回复
首先你的类中实现了这些接口对吗。
那么把你的接口的声明单元加到你的主程序中,然后你的主程序都用接口来获得从DLL得到的对象即可以。
不过有一点要注意,DLL中的类的方法如果有字符串的,要用PCHar,不然会出现问题。

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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