【问题标题】:Load runtime packages from standalone application从独立应用程序加载运行时包
【发布时间】:2014-09-18 18:57:16
【问题描述】:

我想与您确认一个问题。

场景如下。我们有两个系统。一个旧的,它是一个独立的可执行文件,另一个是全新的,带有包的模块化。

是否可以在独立应用程序中动态加载包?

需要在我的旧应用程序中加载具有表单并显示的包。

在我的测试中,问题是独立应用程序表单类中的加载包为零。

下面的代码说明了这种情况:

Procedure TForm3.LoadPackageTest;
Const
  CClass = 'TAboutBox';

Var
  phm: HModule;
  LFormClass: TPersistentClass;
  LForm: TCustomForm;

Begin
  phm := LoadPackage('C:\_Dev\MyProjTest\forminbpl\BPLS\TestPack.bpl');

  If phm <> 0 Then
    Try

      //the problem!!!
      //In StandAlone application, not found class.
      LFormClass := TPersistentClass(GetClass(CClass));


      If Assigned(LFormClass) Then
      Begin
        LForm := TCustomForm(TComponentClass(LFormClass).Create(Nil));
        LForm.ShowModal;
        LForm.Free;
      End;

    Finally
      UnloadPackage(phm);
    End
  Else
    ShowMessage('Package not found');
End;

感激不尽。

【问题讨论】:

    标签: forms delphi runtime packages


    【解决方案1】:

    是否可以在独立应用程序中动态加载包?

    是的。您需要遵守运行时包的规则。具体来说,所有包和主机可执行文件都使用相同版本的 Delphi 编译,并且都使用运行时包。为了能够从主机使用GetClass,您需要在包中调用RegisterClass。这篇文章似乎包含所有必要的细节:http://edn.embarcadero.com/cn/article/27178

    至于您是否能够展示您的表单,这完全取决于您是否正确设计了独立的包裹。


    在 cmets 中添加关键细节。您希望在没有运行时包的情况下构建独立应用程序。你不能这样做。如果你想以这种方式使用运行时包,为了有一个单一的共享类注册表,那么各方都必须使用运行时包。

    【讨论】:

    • 大卫,感谢您的回答。关于包的结构,没关系。出现的问题是我在独立应用程序中加载包时找不到表单类。在我的独立应用程序中,如果我将其设置为“运行时包”,那么一切正常。
    • 哦,现在你已经改变了问题。你最初问是否可能。你现在问什么?我的猜测是您没有在包中注册该类。你在包里做吗,RegisterClass('TAboutBox')?
    • 嗨,大卫。关于你的问题,是的,我在包中注册了“TAboutBox”类。好的。对不起,也许我无法解释它。问题是这样的。如果我尝试将这个包打开到 EXE 中而不检查包中的“构建运行时包”选项将不起作用。仅当我选中“构建运行时包”选项时才有效。我的问题是是否可以从另一个应用程序打开一个包,但是在一个独立的应用程序上(构建运行时包 = False)。
    • 您必须在主机中使用运行时包。否则GetClass 怎么可能工作?
    • 然后,参考GetClass方法,它会在我的包的启动和我的单元启动时起作用。但是当加载包的可执行文件有“Build with runtime packages = False”选项时,加载包后,单元没有初始化和注册类。因此质疑至今从未有必要这样做。但我相信,如果调用包的可执行文件是“使用运行时包构建 = True”,则您无法加载包和表单。无论如何,谢谢你的朋友。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多