又是DLL问题, RTTI技术相关

dfasri 2009-01-08 08:34:39
为何DLL中, 组件里面, 就算是使用 is 操作符也能够判断出是否为该类型
比如 XXObj is TComponent 是可以返回正确的

但是, 自己写的居然就不能返回正确信息!

不过情况是有点不太一样, 因为我的是从dll中把对象传给exe, 然后在exe中进行 is 操作符的判断的

是不是有什么编译开关要设置?

有哪位高手知道
...全文
109 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfasri 2009-01-09
  • 打赏
  • 举报
回复
就是为了省下一部分组件的编写, 才看看有没有办法使用的

使用接口是百分百可行的, 但是需要用到某些对象, 要麻烦的去写接口的话, 因为DELPHI不像C++那样可以多重继承, 是非常麻烦的.
某些组件, 接口的实现都是一至的, 但是不得不每个组件去写.

不过看来DELPHI当中是没办法了
starluck 2009-01-09
  • 打赏
  • 举报
回复
可翠試著用接口,COM來做
dfasri 2009-01-08
  • 打赏
  • 举报
回复
这就问题大了
再请问一下, 是否知道组件都有没有这种像 IDataSetComponent这类的接口呢?
如果不是底层TComponent写好, 那么我弄的对象就要每个都继承某个接口, 然后采用 QueryInterface 这个来作判断了=.=
金卯刀 2009-01-08
  • 打赏
  • 举报
回复
目前delphi中exe和dll之间对象的共享,只能是虚方法的共享,因为它们是晚期绑定,可以准确找到地址。
其他的对象数据,都是按各自的虚拟线性地址空间分配位置。因此,它们之间传递对象数据地址是没有意义的。
starluck 2009-01-08
  • 打赏
  • 举报
回复



DLL 中注意要引用 shareMem且调用都用上shareMem 。 应用程序只能调用DLL的动态方法。

对象传递更多是因为堆的建立的问题。

可以试着定义一个记录类型

type
TClassRec = record
iIndex : integer;
iType : Tobject;
end;

然后把对象这样试下
starluck 2009-01-08
  • 打赏
  • 举报
回复
转:

我们需要在Dll中new一个class或者struct的实例,通过接口把这个实例传给了主程序(调用dll的程序),最后这个实例的释放(delete)是由主程序来执行的,这时我们的问题出现了,vs.net抛出一个debug模式下的异常,是在delete函数中。后来我试了另外一种情况,即在主程序中new的实例在dll中delete也会有相同的问题。哪位大侠知道为什么?


另外,还有一个小问题,就是在dll中的导出(dllexport)类中,如果有stl的变量存在如list<int>等,在编译的时候会有一个有关dll 接口不一致的warning,不知道怎么解决这个问题。

A:
不同的DLL中完全可能会维护不同的局部堆,这与编译器的实现有关。有些编译器可以选择使用进程共享的局部堆,但性能会受影响。

如果是不同的局部堆,当你在DLL中new时,是在DLL的堆中分配的;而当你在EXE中delete时,EXE会认为它是在EXE的局部堆中分配的,从而用EXE的堆信息去释放它,从而可能导致错误。具体情况与堆管理代码的实现有关。

最好为你的class或struct提供一个虚的free方法,在里面调用delete。不管是从EXE中分配的还是从DLL中分配的,都可以安全地用free方法释放,因为free是虚的,它的代码会和分配它的代码编译在同一个可执行体中。

我不赞成用引出类的方法提供功能,因为类成员的签名生成并没有一个标准,很难使用。

用DLL提供的类最好是只引出创建对象的函数,返回类型是一个“纯抽象类”指针,我说的“纯抽象类”指没有成员变量,没有非抽象方法的类。并且有一个公开的抽象的free方法负责释放。使用时调用创建函数创建一个(衍生类) 的对象并返回,然后调用对象的成员方法来完成操作。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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