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

时间:2010-10-21 07:37:33

标签: delphi memory-management runtime frames bpl

最近我开始了一个有很多表单,框架和额外控件的项目,所以我的应用程序膨胀了,我在我的项目中使用了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软件包的情况下创建这样的应用程序

2 个答案:

答案 0 :(得分:3)

1)我认为它很自然,特别是如果有很多物体/图像等,如果你将一些图像/表格等移动到dll作为资源怎么样。然后在需要时调用它,如果没有则释放。

2)尝试检查内存泄漏。我之前遇到同样的问题,当我的程序启动时,内存使用量越来越大。尝试使用FastMM4。

3)排除一些未使用的bpls。因为即使你不使用它也会创建运行时。例如“InterBaseDriver; DBXMySQLDriver; dbexpress; dbxcds; VirtualTreesD12等......”我没有使用它,所以我不会删除它。试着了解你曾经使用过的所有单位。

答案 1 :(得分:1)

不要将dll用于你的帧,而是使用bpl。

因此,创建一个新包,在其中添加框架的代码。在您的应用程序中,将该单元与框架一起使用,并像通常那样调用TFrame2.Create(Self);,如果您没有dll的话。

在exe中:

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