社区
Delphi
帖子详情
又是DLL问题, RTTI技术相关
dfasri
2009-01-08 08:34:39
为何DLL中, 组件里面, 就算是使用 is 操作符也能够判断出是否为该类型
比如 XXObj is TComponent 是可以返回正确的
但是, 自己写的居然就不能返回正确信息!
不过情况是有点不太一样, 因为我的是从dll中把对象传给exe, 然后在exe中进行 is 操作符的判断的
是不是有什么编译开关要设置?
有哪位高手知道
...全文
142
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++的模板可以帮助我们编写适合不同类型的模板类,给代码的复用性提供了极大的方便。近来写了一个涉及单例的C++模板类,简化下来可以归结为以下的代码: template <typename T> class Singleton { public: // 此处省去了多线程安全锁 static T* getInsta...
RTTI
Obfuscator 项目常见
问题
解决方案
RTTI
Obfuscator 项目常见
问题
解决方案 1. 项目基础介绍和主要编程语言
RTTI
Obfuscator 是一个开源项目,主要功能是混淆二进制文件中的运行时类型信息(
RTTI
)。通过混淆这些信息,可以提高软件的安全性,使得攻击者更难以分析和利用程序的弱点。该项目的目标是保护软件免受逆向工程和篡改。主要编程语言为 C++。 2. 新手在使用这个项目时需要特别注意的3个
问题
及解决步骤 问...
wxWidgets:不使用 C++
RTTI
时的注意事项
wxWidgets:不使用 C++
RTTI
时的注意事项wxWidgets:不使用 C++
RTTI
时的注意事项Bind()
问题
wxAny
问题
wxWidgets:不使用 C++
RTTI
时的注意事项 笔记 在大多数 wxWidgets 构建中,C++
RTTI
通常默认启用。如果您不知道您的构建是否启用了 C++
RTTI
,那么它可能已启用,您不必担心本节中提到的任何内容。 虽然通常 wxWidgets 标准运行时类型信息 (
RTTI
)在整个库中使用,但在某些地方它不起作用。这些地方之一是模板类
计算机提示vcruntime140.
dll
丢失,教你5个方法快速解决
dll
问题
当计算机系统中无法找到vcruntime140.
dll
这个特定的动态链接库文件时,可能会引发一系列运行
问题
,具体表现形式多样且影响范围较广。对于依赖于该文件运行的各类软件应用来说,缺失vcruntime140.
dll
将直接导致程序无法正常启动或执行,用户在尝试打开这些应用时可能会收到“找不到指定模块”或“
dll
文件丢失”的错误提示。此外,在游戏应用中,如果缺少vcruntime140.
dll
文件,可能会阻止玩家顺利进入游戏,甚至可能在加载界面就停滞不前,严重影响用户体验。
解决MSVCP110.
DLL
缺失
问题
的实用指南
MSVCP110.
DLL
是Microsoft Visual C++运行时库的一部分,这个库是C++开发应用程序时不可或缺的组件,尤其是在2012年发布的Visual Studio 2012版本中。其主要功能包括支持程序在Windows操作系统上正常运行,执行各种基础服务和功能,例如内存管理、文件操作和多线程处理。运行时库是伴随着应用程序运行时所需要的库文件集合,它们提供了程序运行时所需的基础服务和函数。
Delphi
5,944
社区成员
262,941
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章