- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在考虑使用动态加载 BPL 并将对象实例从主应用程序传递到 BPL 中的方法。这在应用程序和 BPL 使用的单元之间造成了问题。
我编写了一个小型原型(prototype)来执行此操作,并且很好奇 Delphi 如何在内部管理应用程序与 BPL 中定义的类之间的差异。
例如,假设一个基本的 Widget 类,例如:
TmyWidget = class
private
fId:Integer;
fDescription:String;
public
procedure DoSomething1();
end;
现在应用程序和 BPL 是使用包含 TmyWidget 类的单元构建的。后来,TMyWidget 中发生了一些变化,应用程序被重建,但 BPL 没有(反之亦然)。我添加了另一个方法 DoSomething2() 并在应用程序中创建了 TmyWidget 的实例,并将其传递给 BPL 进行处理,然后在基本的例子,它有效。但它显然充满了潜在的问题。
如果另一个动态加载的 BPL 也使用 TmyWidget 那么事情会变得更加有趣。这似乎有效,但感觉绝对不理想。
主要问题是 - 通常如何在主应用程序和 DLL 或 BPL 之间传递对象?我以前从未尝试过,并且可能有充分的理由,但我有一个适合这种方法的想法......
我认为最好的方法是序列化对象并传递这些字节并在 DLL/BPL 中反序列化它,此过程要注意主机和动态加载模块之间的潜在版本差异,但我希望新的 SimpleSharedMem 选项可能会带来这个新功能,而无需序列化的开销,但它似乎不是很有用,除非您严格保持应用程序和 dll 在任何共享代码更改上重建......但在这个原型(prototype)中,应用程序将保持相当恒定,动态加载的模块会随着功能添加到 TmyWidget 而频繁变化。 (服务器应用程序充当根据客户端请求构建 TmyWidget 的工厂,并且应用程序会将实例传递给各个模块进行处理。)
最佳答案
...was curious how Delphi internally manages differences between classes defined in the app vs. the BPL
Delphi 通过不允许它来管理它。您不能同时在多个包中拥有同名的单元:如果您这样做,您会收到一条错误消息,内容类似于 Package XYZ已经包含 ABC
(还没有看到等一下...)。由于类型名称包含单元名称,因此两个不同的包中不能有相同的类型。除非它是由 GUID 定义的接口(interface),但这是一个不同的故事。
... how does one typically pass objects to and from the main application and DLLs or BPLs?
您不将对象传递给 DLL,这不是一个好主意。当您需要将对象传递给 BPL 时,请确保将该 BPL 的基类定义到第三个 BPL 中。
示例。 TmyWidget
的多态行为可能是使用一些虚拟方法定义的。确保您有一个定义所有这些虚拟方法的 TmyWidgetBase
类,从该基类派生所有 TmyWidget
并传递类型为 TmyWidgetBase 的对象
。确保 TmyWidgetBase
类位于它自己的包中。
当我尝试这样做时,我最终得到了一个很小的“引导”exe 和很多 BPL。本质上所有逻辑都在 BPL 中,以方便传递对象。
关于delphi - 动态加载BPL的共享代码/传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248564/
我正在使用 C++ Builder 10 Seattle,我正在尝试安装一个组件包,该组件包注册了在不同 bpl 中实现的组件。 从技术上讲,我已经这样做了: 我创建了两个包。一个仅定义为运行时 (c
我想知道是否有人知道一种优雅的方法来确定给定(编译)的 DLL、EXE 或 BPL 需要哪些 BPL。 我不确定这是否可能比简单地扫描二进制文件中对 .bpl 文件名的文本引用(这可能容易出现误报 )
我的一般问题是如何解决“由于依赖项不会消失,无论我清理和重新编译多少次,我的 BPL 都不会加载”。 更新 您可能认为您有一个干净的重新编译系统,但由于 Windows 的逆向奇迹及其文件系统虚拟化错
Delphi 中设计时包的可怕错误之一是以下错误,这意味着注册安装新组件到您的 Palette 上的包: Component TSomething can't be registered by pac
我有一个 BPL 项目(带有一些基本内容)和一个 EXE 项目,该项目的搜索路径中包含其他项目输出(BPL 和 DCP)的位置。当使用“Build With Runtime Packages”构建 E
我在 Internet 上发现的每个 BPL 相关问题都涉及一些 BPL,这些 BPL 已经随 Delphi 一起提供,或者至少在全局范围内安装到 Delphi 文件夹中。 我想制作我自己的应用程序来
我正在学习 TMS 的一个组件。我收到“...rtl100.bpl 未找到...”。如果我使用包含“rtl”的“使用运行时包构建”,可能会发生此错误。 rtl100.bpl 在哪里(我使用的是 D20
情况如下。我通常使用 RAD Studio 2010 进行 Delphi 开发。我有一些组件想以二进制形式重新分发(*.bpl,没有源代码)。但我希望人们能够使用它们,尽管有 Delphi 版本。但是
有一个从 BPL 导出的函数,简化如下 function DoA(amount: currency; var Info: string): Currency; stdcall; begin re
看起来很简单,但下面的代码不起作用。 BPL: procedure DoSomething(); begin LogEvent('Did'); end; exports DoSomething
我使用ADO Component制作了一个应用程序,并使用它连接到Oracle,当我在另一台计算机上运行它时,我没有任何问题。 但是,当我使用ODAC组件和TOraSession并通过Direct C
是否可以在程序启动时检查客户端计算机上安装了哪个版本的 BPL(即 Rtl70.BPL、Indy70.bpl 等)? 我有一些程序崩溃,因为那里计算机上的 BPL 与构建机器上的不同。 如果我必须在每
我使用 Delphi XE,我有以下设置: Mydll.dll和Package1.bpl(运行时包)都包含Unit3.pas unit Unit3; interface implementation
我正在尝试将 Orpheus 4.08 的最新版本添加到 Delphi XE2 和 Delphi XE3 中。除了通常的警告之外,包编译时没有错误,并且编译器发出成功信号。但是,我找不到 *.bpl
我正在 RAD Studio 2007 中开发一个项目,使用 C++ 中的 VCL 类。 TDBLookupControl 是 VCL 的一部分,并且有一些不良行为,这是由于使用内部变量 Search
试图了解为什么我们会收到“未找到入口点”的消息,而我知道它应该在那里。除了 map 之外,是否有一个工具可以“探索”.bpl 或 .dll 并显示入口点? 最佳答案 Delphi 附带 a comma
我正在一名delphi IDE专家中工作,现在为了避免依赖性问题,我正在考虑将这位专家重建为dll专家,正如其中一个answers中所建议的那样。 ,现在我的专家(编译为 bpl)访问 Screen
如果我在 EXE 中有一个资源并且我想提取它,这非常简单。像这样的东西: stream := TResourceStream.Create(HInstance, ResourceName, RT_RC
从 BPL 中,是否可以获得自己的文件名?例如C:\foo\bar.bpl (动态加载和delphi7,如果重要的话) 最佳答案 调用GetModuleFileName 。对于模块句柄,请使用 Sys
我想创建 *.bpl 文件,但我没有这样做。 具体来说,我正在尝试制作 JEDI 插件,但我也尝试过一个空的纯 Delphi 包。 如果我在 Delphi XE3 中创建一个新包,我会得到一个空单元
我是一名优秀的程序员,十分优秀!