1

最近我开始了一个有这么多表单、框架和额外控件的项目,所以我的应用程序膨胀了,我在我的项目中使用了 3 个 exe(全部在 Delphi 2009 中制作),这些应用程序也共享相同的框架和表单。所以我用 dll 来分享这些表格。

但是一个问题来了,说不同的 Tfont 错误。所以我在网上提出了答案,并给出了选择 | 使用运行时包构建然后一切都开始完美地工作

但是当我检查 Windows 任务管理器 | memusage 它是〜21 500 kb(21.5 mb)。(但没有使用运行时包构建的内存使用量仅为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 包的情况下创建这样的应用程序

4

2 回答 2

3

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

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

3)排除一些没有被使用的bpls。因为即使您不使用它,它也会创建运行时。例如“InterBaseDriver;DBXMySQLDriver;dbexpress;dbxcds;VirtualTreesD12 等。”我没有使用它,所以我不打算排除它。尝试了解您使用的所有单位,它们属于哪个 bpl。

于 2010-10-21T09:14:24.073 回答
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;
于 2010-10-21T12:44:34.067 回答