运行时包加载与静态链接

ZzZ*_*mbo 0 delphi

所以,我有一个自己写的运行时包.如果包是静态链接的,则使用的项目具有对导出数据的完全访问权限,因为编译器完全了解从中导入的内容,对不对?但也可以通过LoadPackage()动态加载包.但是,如何使用类导入的复杂数据结构呢?除了使用FindClass('TSomeClass')和调用RTTI来操作导入类的实例之外,我找不到一种可行的方法.

Rob*_*edy 5

编译器完全了解包中的内容,因为DCU和DCP文件告诉它有什么.

IDE知道包中的内容,因为它知道如何Register在所有单元中找到该过程,该过程告诉IDE有关可用类的信息.

在大多数情况下,程序知道程序包中的内容,因为程序使用了该程序包中的单元,并且编译器确保在运行时提及这些单元中的事物名称将解析为BPL文件中的相应内容.这包括在程序的导入表中提及BPL文件,因此操作系统会自动加载BPL.

如果您希望加载的BPL列表只能在运行时确定,那么您不能使用这些包中的任何单位.您必须动态加载包.

仍然存在如何使用这些包中的内容的问题.您可以尝试使用RTTI发现整个内容.不过,这不是野餐.相反,定义所有相关模块将使用的中间包.

为所有包的类定义接口或公共基类.将该类的定义放在它自己的包中的单元中,我们称之为Shared.bpl.将该包包含在所有其他包 EXE 的"需求"列表中.现在,一切都可以引用共享单元和公共基类.

这正是德尔福本身所做的.共享包称为RTL和VCL.已经定义了几个常见的基类,包括TComponent.在你的情况下,听起来你需要一些常见的定义TComponent.