簡體   English   中英

如何使用Delphi Dll而不啟用Build with runtime packages

[英]How to use Delphi Dlls without enabling Build with runtime packages

最近我開始了一個有很多表單,框架和額外控件的項目,所以我的應用程序膨脹了,我在我的項目中使用3個exes(全部在Delphi 2009中制作),這些應用程序也共享相同的框架和表單。 所以我用dll分享這些表格。

但是有一個問題是說不同的Tfont錯誤。 所以我在網上進行了評論,並附上答案說選擇| 使用運行時包構建 然后每件事都開始完美地運作

但當我檢查Windows Taskmanager時 memusage它是~21 500 kb(21.5 mb)。(但是如果沒有Build with runtime packages,mem的使用量只有2000 kb,還包括通過在所有3個exe項目中添加它來手動創建幀)我的編譯器也很慢,啟用了Build with運行時包

現在我必須用3個exes + delphi bpl運行時包+ dll分發項目

但我想知道memusage是如何增加的,我只想要分發3個exes + dll (只是正常的delphi exes被分配)我甚至使用過內存管理器但沒有工作

如何克服這個問題

這是我使用的代碼

在exe中

procedure TForm1.Button1Click(Sender: TObject);
type
TGetTheFrame =Function( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall ;
 var
  GetTheFrame : TGetTheFrame;
begin
try
   GetTheFrame(application,TabSheet1).Free ;
except
end;
frm := GetTheFrame(application,TabSheet1) ;
dllHandle := LoadLibrary('project1.dll') ;
   if dllHandle <> 0 then
   begin
     GetTheFrame := GetProcAddress(dllHandle, 'GetTheFrame') ;
  frm := GetTheFrame(application,TabSheet1)   //call the function
    {   ShowMessage('error function not found') ;
     FreeLibrary(dllHandle) ; }
   end
   else
   begin
     ShowMessage('xxxx.dll not found / not loaded') ;
   end

在DLL中

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Forms,StdCtrls, Controls,

  Unit2 in 'Unit2.pas' {Frame2: TFrame};

{$R *.res}

Function  GetTheFrame( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall;
Begin
 Result := TFrame2.Create( Owner );

 Result.Parent := TheParent;
End;


exports gettheframe;

begin
end.

最后如何在沒有運行時包裝的情況下完成所有這些操作

不僅僅是內存問題,請告訴我如何在沒有buildwithruntime軟件包的情況下創建這樣的應用程序

1)我認為它是自然的,特別是如果有很多物體/圖像等,如果你將一些圖像/表格等移動到dll作為資源怎么樣。 然后在需要時調用它,如果沒有則釋放。

2)嘗試還檢查內存泄漏。 我之前遇到同樣的問題,當我的程序啟動時,內存使用量越來越大。 嘗試使用FastMM4。

3)排除一些未使用的bpls。 因為即使你不使用它也會創建運行時。 例如“InterBaseDriver; DBXMySQLDriver; dbexpress; dbxcds; VirtualTreesD12等......”我沒有使用它,所以我不會刪除它。 試着了解你曾經使用過的所有單位。

不要將dll用於你的幀,而是使用bpl。

因此,創建一個新包,在其中添加框架的代碼。 在您的應用程序中,使用帶框架的單元並調用TFrame2.Create(Self); 就像你通常做的那樣,如果你沒有dll的話。

在exe中:

procedure TForm1.Button1Click(Sender: TObject);
var
  MyFrame: TFrame2;
begin
  MyFrame := TFrame2.Create(Tabsheet1);
  MyFrame.Parent := Tabsheet1;
end;

暫無
暫無

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

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