2014-09-18 90 views
-1

我想确认您的问题。从独立应用程序加载运行时软件包

该场景如下。我们有两个系统。一个老版本,它是一个独立的可执行文件,另一个是全新的,与软件包模块化的。

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

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

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

下面的代码说明了情况:

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; 

感激。

回答

0

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

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

至于你是否能够显示你的表格,全部取决于你是否正确地设计你的包独立。


在评论中添加了至关重要的细节。您希望独立应用程序无需运行时软件包即可构建。你不能这样做。如果您想以这种方式使用运行时包,那么为了有一个共享类注册表,那么所有参与方都必须使用运行时包。

+0

大卫,谢谢你的回答。关于软件包的结构,它是没问题的。发生的问题是,当我在独立应用程序中加载包时,找不到表单类。 在我的应用程序独立,如果我将它设置为“运行时包”,以便一切工作正常。 – Delphiman 2014-09-18 19:18:17

+0

哦,现在你已经改变了这个问题。你最初问是否可能。你现在在问什么?我的猜测是你没有在包里注册这门课。你在包装上做了什么,'RegisterClass('TAboutBox')'? – 2014-09-18 19:20:02

+0

嗨大卫。关于你的问题,是的,我在Package中注册了课程“TAboutBox”。好的。对不起,也许我一直无法解释它。问题是这样的。如果我尝试打开这个包到EXE中而没有检查包中的“生成运行时包”选项不起作用。只有当我选中“Build runtime packages”选项时才有效。 我的问题是是否有可能从另一个应用程序打开一个包,但是在独立应用程序(Build runtime packages = False)中打开一个包。 – Delphiman 2014-09-18 19:30:11

相关问题