社区
Delphi
帖子详情
又是DLL问题, RTTI技术相关
dfasri
2009-01-08 08:34:39
为何DLL中, 组件里面, 就算是使用 is 操作符也能够判断出是否为该类型
比如 XXObj is TComponent 是可以返回正确的
但是, 自己写的居然就不能返回正确信息!
不过情况是有点不太一样, 因为我的是从dll中把对象传给exe, 然后在exe中进行 is 操作符的判断的
是不是有什么编译开关要设置?
有哪位高手知道
...全文
138
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方法负责释放。使用时调用创建函数创建一个(衍生类) 的对象并返回,然后调用对象的成员方法来完成操作。
C++中模板单例的跨SO(
DLL
)
问题
:
RTTI
,typeid,static,单例
C++模板单例在不同SO(
DLL
)中会导致每个SO内部的单例对象地址不同,不是真正的全局单例。由于模板在编译时实例化,导致
RTTI
测试返回false,即不同SO内的单例类型信息不一致,但类型名字相同。这种情况下,模板实现的单例无法跨SO。
RTTI
Obfuscator 项目常见
问题
解决方案
RTTI
Obfuscator 是开源项目,用 C++ 编写,可混淆二进制文件中的
RTTI
信息,提高软件安全性。新手使用该项目时,常遇到如何混淆二进制文件、混淆后是否影响程序运行、编译源码遇
问题
等,文中给出了相应解决步骤,使用时需遵循项目许可证。
wxWidgets:不使用 C++
RTTI
时的注意事项
本文介绍了在禁用C++
RTTI
时使用wxWidgets可能遇到的
问题
,包括Bind()和wxAny的使用限制。Bind()
问题
主要涉及动态事件处理,若仅使用Bind()而不涉及Unbind(),则影响较小。wxAny
问题
在于其动态类型特性可能导致跨二进制边界的使用出现
问题
,解决方案是为所有
相关
类型在共享库中实现wxAnyValueTypeImpl<>的特化。
计算机提示vcruntime140.
dll
丢失,教你5个方法快速解决
dll
问题
本文详细阐述了vcruntime140.
dll
在Windows系统中的关键作用,解释了其缺失可能导致的各种
问题
,如软件无法启动、游戏体验受阻。文章提供了五种修复方法,包括重新安装VisualC++Redistributable、更新系统、使用
DLL
修复工具和手动复制或系统还原。
解决MSVCP110.
DLL
缺失
问题
的实用指南
本文介绍了MSVCP110.
DLL
文件在Microsoft Visual C++ 2012运行时库中的作用,阐述了
DLL
文件在Windows系统的功能及对C++程序运行的重要性。详细说明了MSVCP110.
DLL
缺失或损坏的原因,提供了重新安装运行时包、使用系统工具等修复方法,还提及了
相关
安全风险和维护建议。
Delphi
5,943
社区成员
262,942
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章