2014-09-18 61 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

相關問題