2010-10-21 20 views
1

最近,我開始了一個有很多窗體,框架和額外控件的項目,所以我的應用程序已經膨脹起來,並且在我的項目中使用了3個exes(全部由Delphi 2009 )並且這些應用程序也共享相同的框架和表單。所以我用dll來分享這些表單。如何使用Delphi Dll而不啓用使用運行時包構建

但問題來了,說不同的Tfont錯誤。所以我refferd網上,並回答說選擇|使用運行時軟件包構建然後每件事開始工作完美

但當我檢查Windows Taskmanager | memusage是〜21 500 kb(21.5 mb)(但mem使用率只有2000 kb,沒有使用運行時軟件包的Build,也包括在所有3個exe項目中手動添加框架),而且我的編譯器在啓用Build with運行時包

,現在我必須與3的EXE +德爾福BPL運行時包+的DLL

分配的項目,但我想知道MEMUSAGE如何提高,我只是想destribute 3的EXE + 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包這樣的應用

回答

3

1)我認爲它的自然,特別是如果有很多對象/圖像等的怎麼樣,如果你還可以將一些圖片/表格等作爲資源dll。然後在需要時調用它,如果不是,則釋放它。

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

3)排除一些未被使用的bpls。因爲即使您不使用它,也會創建運行時。例如「InterBaseDriver; DBXMySQLDriver; dbexpress; dbxcds; VirtualTreesD12等..」我沒有使用它,所以我不會排除它。試着去了解你所使用的所有單位,以及它們所屬的單位。

+0

我用fastmm4但無法正常工作 – VibeeshanRC 2010-10-21 11:55:26

+0

當我包括了所有這些對象和編譯EXE只花了2000 KB MEMUSAGE的裏面,所以我認爲所有的問題都與運行bpls – VibeeshanRC 2010-10-21 12:01:49

+0

只是告訴我如何在沒有選擇使用運行時構建的情況下實現這個代碼 - >項目選項|包 – VibeeshanRC 2010-10-21 12:03:22

1

不要對你的框架使用dll,而應該使用bpl。

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

在EXE:

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

嘿,對不起,我不能使用bpl,因爲軟件的其他部分是用vb編寫的,所以我必須使用dlls – VibeeshanRC 2010-10-21 13:37:48

+0

@Vibeeshan:我不認爲有可能使用TFrames與VB – 2010-10-21 14:08:49

+0

而不是tframes,但在此dll中的變量 – VibeeshanRC 2010-10-21 15:00:33

相關問題