簡體   English   中英

使用BPL加載Delphi對象運行時

[英]Loading a Delphi Object Run Time using BPL

我有一個單元課。 通常,當我更改其方法的算法時,我必須重新編譯它並整體交付補丁。 我認為使用DLL創建類的實例。 在delphi.about.com中搜索后,我發現可以使用BPL而不是使用DLL。 它是Delphi的DLL。 問題是我發現的幾乎所有示例都只是在告訴如何導出函數。 我想動態地加載BPL,每當替換BPL時,我都可以獲得類的最新算法,而不僅僅是導出的函數。

我讀過的文章:
-http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm
-Delphi應用程序的插件系統-bpl vs dll?
-http://delphi.about.com/library/weekly/aa012301a.htm

任何URL或SAMPLE如何從頭開始創建BPL來封裝組件或類都是非常感激的。


親愛的大師,

假設我有這樣的代碼:

unit unitA;

interface

type
  B = class(TObject)
  public
    procedure HelloB;
  end;

  A = class(TObject)
  public
    function GetB: B;
    function HelloA: String;
    procedure Help;
  end;

  implementation

  uses
      Dialogs;

  { B }

   procedure B.HelloB;
   begin
     ShowMessage('B');
   end;

  { A }

  function A.GetB: B;
  begin
    Result := B.Create;
  end;

  function A.HelloA: String;
  begin
    Result := 'Hello, this is A';
  end;

  procedure A.Help;
  begin
    //do something
  end;

  end.

我想導出A的所有公共方法。如何使其成為DLL? 如何從另一個單元中將其導入到哪里? 比方說:

 var a: A;

 a := A.Create;
 a.GetB;
 showMessage(a.HelloA);

在單元中未聲明A(它在DLL中)。 請指教。


歡呼。 昨晚我知道了。 我要做的就是使對象實現一個接口,該接口在調用方單元中用於捕獲DLL返回的對象的實例。

謝謝你們。

梅森已經把它釘牢了,但是讓我詳細說明為什么BPL不是您想要的。 BPL是Delphi IDE加載共享相同內存管理器和RTL的組件的一種方式。 (類型標識幾乎可以使用BPL透明地工作)

但是,被捆綁的依賴關系幾乎總是不可接受的。 除了IDE,IDE仍然無法處理不同版本的RTL和VCL。

當您僅在應用程序及其DLL之間傳遞接口引用時,則根本不必共享RTL,VCL或共享包。

這也意味着您可以用另一種語言(C ++,C#,FPC,另一種Delphi版本)編寫某些DLL,而仍然使用對象。 當您不想移植主應用程序但仍想使用Delphi或您的Delphi版本不可用的現有庫時,這可能很誘人。

將類放在外部文件中的問題是您的主應用程序需要知道某種引用它的方法。 它要么必須繼承於將您需要的所有方法公開為虛擬方法的基類,要么必須實現一個包含您需要的所有功能的接口。

如果您已經知道對象的界面應該是什么樣子,而您所要做的只是更改實現細節(例如內部算法),那么最簡單的方法可能是使您的類實現一個接口並將其放在一個DLL中,該DLL可以導出返回此接口實例的函數。 這樣一來,您就不必擔心將您的應用程序分解為多個程序包,這可能是一個真正的麻煩。

我在問題描述中什么都沒有看到,這表明您需要從包中顯式導出任何內容,或者需要在運行時動態加載它。 相反,您的函數駐留在可以與主程序分開替換的運行時包中就足夠了。

啟動一個新的包項目,並將您班級的單元以及它所依賴的任何其他單元移到該項目中。 編譯項目。 如果編譯器警告“隱式包括”任何其他單元,請將它們也添加到程序包中。

現在,從EXE項目中刪除所有程序包單元。 這兩個項目都不應有任何單位。 接下來,打開EXE項目選項中的“使用運行時程序包構建”復選框。 將您的軟件包添加到以分號分隔的軟件包名稱列表中。 RTL和VCL軟件包也可能會在該列表中。

編譯兩個項目,您就完成了。

如果您對類的實現進行了更改,則只能重新編譯該包並將新版本發送給客戶。 當您用新文件替換原始文件時,該程序將自動獲得新更改。 該程序包在程序的導入表中列出,因此,操作系統在加載EXE時會自動加載BPL文件。 EXE不需要運行任何特殊代碼即可加載程序包。

Delphi可以創建DLL來導出功能,或者創建BPL來導出組件。

您可以創建組件,對其進行編譯(使用與主應用程序相同的編譯器設置),然后Delphi將創建.bpl。 然后將此組件導入Delphi,並使用該組件作為包編譯您的應用程序。

我對使用Delphi 4創建的組件的經驗證明,一個大型應用程序比帶有單獨的.bpls的應用程序更可靠。 它是多線程服務器,如果獨立編譯,效果很好,但是如果使用軟件包編譯,則在短時間后崩潰。 我希望較新版本的Delphi在此方面有所改進。

注意內存管理(在應用程序中,不要釋放程序包中分配的內存,反之亦然)和編譯器設置。

如果您喜歡about.com,則此鏈接將非常有用 BPL是特殊的DLL!

BPL有其用法。 例如,如果您必須制作一個非常大的應用程序(如Erp),則需要嘗試認真使用BPL。

另一方面,BPL對崩潰的應用程序不負責。 BPL的使用不當會造成這種情況。

您可以嘗試MAF組件,它們可以處理插件,並且為您提供更多功能,而無需額外的代碼。 隨附教程和帶有源代碼的演示應用程序。

http://www.maf-components.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM