社区
Delphi
帖子详情
又是DLL问题, RTTI技术相关
dfasri
2009-01-08 08:34:39
为何DLL中, 组件里面, 就算是使用 is 操作符也能够判断出是否为该类型
比如 XXObj is TComponent 是可以返回正确的
但是, 自己写的居然就不能返回正确信息!
不过情况是有点不太一样, 因为我的是从dll中把对象传给exe, 然后在exe中进行 is 操作符的判断的
是不是有什么编译开关要设置?
有哪位高手知道
...全文
126
6
打赏
收藏
又是DLL问题, RTTI技术相关
为何DLL中, 组件里面, 就算是使用 is 操作符也能够判断出是否为该类型 比如 XXObj is TComponent 是可以返回正确的 但是, 自己写的居然就不能返回正确信息! 不过情况是有点不太一样, 因为我的是从dll中把对象传给exe, 然后在exe中进行 is 操作符的判断的 是不是有什么编译开关要设置? 有哪位高手知道
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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方法负责释放。使用时调用创建函数创建一个(衍生类) 的对象并返回,然后调用对象的成员方法来完成操作。
解决
dll
导出函数多余的办法_delphi_
delphi 解决
dll
文件 导出函数多余的办法
RTTI
RTTI
概念
RTTI
(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。
RTTI
机制的产生 为什么会出现
RTTI
这一机制,这和C++语言本身有关系。和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态
Delphi的
RTTI
&VMT
网上已经有很多关于
RTTI
的博客,最近刚好看到这里,以前没弄懂的东西,这次一起搞明白一下,写个博客,算是做个笔记。 这里有一篇英文文档,说的很详细: Delphi Q&amp;amp;amp;A 概念 每个Delphi的类都有一张虚拟方法表(virtual-method table),或者说,Delphi的类是由它来定义的。从编译器角度来看,一个类就是指向VMT的指针。 一个虚拟方法表从指针所指地址的负偏移76 ...
C++中的
RTTI
机制解析
RTTI
概念
RTTI
(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。
RTTI
机制的产生 为什么会出现
RTTI
这一机制,这和C++语言本身有关系。和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,...
RTTI
: 观念,机制解析和实现原理
C++的
RTTI
观念和用途 https://www.cnblogs.com/findumars/p/6358194.html 自从1993年Bjarne Stroustrup 〔注1 〕提出有关C++ 的
RTTI
功能之建议﹐以及C++的异常处理(exception handling)需要
RTTI
;最近新推出的C++ 或多或少已提供
RTTI
。 然而,若不小心使用
RTTI
,可能会导致软件弹性的...
Delphi
5,935
社区成员
262,943
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章