Как использовать Delphi Dlls без включения сборки с пакетами времени выполнения - PullRequest
1 голос
/ 21 октября 2010

Недавно я запустил проект с таким количеством форм, фреймов и дополнительных элементов управления, поэтому мое приложение набрало силу, и я использую 3 exes в своих проектах (все сделано в Delphi 2009), и эти приложения также используют одни и те же фреймы и формы. , поэтому я использовал dlls, чтобы поделиться этими формами.

, но возникла проблема, связанная с ошибкой Tfont. так что я заговорил онлайн и пришел с ответом, чтобы выбрать | Сборка с пакетами времени выполнения . тогда все стало работать отлично

но когда я проверил Windows Taskmanager | memusage это ~ 21 500 КБ (21,5 МБ). (но использование mem составляет всего 2000 КБ без Build с пакетами времени выполнения, включая фреймы вручную, добавляя его во все 3 exe-проекта), и мой компилятор также работает медленно с включением Build with пакеты времени выполнения

и теперь мне нужно распространить проект с 3 exes + delphi bpl пакеты времени выполнения + dlls

но я хочу знать, как увеличился 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 ]

3 голосов
/ 21 октября 2010

1) Я думаю, что это естественно, особенно если есть много объектов / изображений и т. Д. Как насчет того, чтобы переместить некоторые изображения / формы и т. Д. В dll в качестве ресурса.затем вызовите его при необходимости и освободите, если нет.

2) попробуйте также проверить утечки памяти.У меня та же проблема раньше, когда моя программа запускает использование памяти становится все больше и больше.попробуйте использовать FastMM4.

3) исключить некоторые неиспользованные bpls.потому что он создал время выполнения, даже если вы не используете его.пример "InterBaseDriver; DBXMySQLDriver; dbexpress; dbxcds; VirtualTreesD12 и т. д."постарайтесь узнать все единицы, которые вы использовали, к какому bpl они принадлежат.

1 голос
/ 21 октября 2010

Не используйте dll для своих фреймов, а bpl.

Поэтому создайте новый пакет, добавьте в него код вашего фрейма.В вашем приложении используйте устройство с рамкой и звоните TFrame2.Create(Self);, как обычно, если бы у вас не было DLL.

В exe:

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