代码之家  ›  专栏  ›  技术社区  ›  Vibeeshan Mahadeva

如何在不启用运行时包生成的情况下使用Delphi DLL

  •  1
  • Vibeeshan Mahadeva  · 技术社区  · 15 年前

    最近,我开始了一个有很多表单、框架和额外控件的项目,所以我的应用程序不断膨胀,在我的项目中使用了3个前执行官(都是Delphi2009制造的),这些应用程序也共享相同的框架和表单。所以我用dll共享这些表单。

    但有一个问题是说不同的tfont错误。所以我重新上网,并给出了一个答案,说用运行时包选择构建 . 然后每件事都开始完美地工作

    但是,当我检查Windows任务管理器的mem usage时,它大约是21500 KB(21.5 MB)。(但是没有运行时包的生成,mem的使用只有2000 KB,也通过在所有3个exe项目中添加它来手动包含img帧),并且我的编译器在启用运行时包的生成时也工作缓慢。

    现在我要把这个项目分发给 3个Exes+Delphi BPL运行时包+DLL

    但我想知道memusage是如何增加的,我只想取消分配 3 ex+dll (正是Delphi的高级执行人员如何被取消分配)我甚至使用了内存管理器,但没有工作。

    如何克服这个问题

    这是我用的代码

    在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
    

    在动态链接库中

    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 回复  |  直到 15 年前
        1
  •  3
  •   XBasic3000    15 年前

    1)我认为这是自然的,特别是如果有大量的对象/图像等。如果你把一些图像/窗体等作为资源移动到DLL,怎么样?然后在需要时调用它,如果不调用则释放它。

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

    3)排除一些不使用的BPL。因为它创建了运行时,即使您不使用它。例如“interbesdriver;dbxmysqldriver;dbexpress;dbxcds;virtualtreesd12等。”我没有使用它,所以我要排除它。试着了解你过去使用的所有单位,它们属于什么BPL。

        2
  •  1
  •   The_Fox    15 年前

    不要为您的帧使用dll,而是使用bpl。

    因此,创建一个新的包,在其中添加框架的代码。在应用程序中,将该单元与帧和调用一起使用 TFrame2.Create(Self); 就像你平时没有DLL的时候一样。

    在EXE中:

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