【问题标题】:How to use Delphi Dlls without enabling Build with runtime packages如何在不启用使用运行时包构建的情况下使用 Delphi Dlls
【发布时间】:2011-04-28 11:13:33
【问题描述】:

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

【问题讨论】:

    标签: delphi memory-management runtime frames bpl


    【解决方案1】:

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

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

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

    【讨论】:

    • 当我包含所有这些对象并在 exe 中编译时,它只需要 2000 kb 的内存,所以我认为所有问题都出在运行时 bpls
    • 告诉我如何在不选择 build with runtime in -_> 项目选项的情况下实现此代码 |包
    • @Vibeeshan 可能是因为您添加了所有 bpl。尝试排除一些未使用的 bpls。因为即使您不使用它,它也会创建运行时。例如“InterBaseDriver;DBXMySQLDriver;dbexpress;dbxcds;VirtualTreesD12 等。”我没有使用它,所以我不打算排除它。尝试了解您使用的所有单元,它们属于哪个 bpl。
    【解决方案2】:

    不要将 dll 用于您的帧,而应使用 bpl。

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

    在exe中:

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

    【讨论】:

    • 对不起,我不能使用bpl,因为软件的其他部分是用vb编写的,所以我必须使用dll
    • @Vibeeshan:我认为不可能在 VB 中使用 TFrames
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2022-08-12
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多