Как использовать Delphi Dll без включения сборки с пакетами времени выполнения

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

но возникла проблема с другой ошибкой Tfont. поэтому я заглянул в Интернет и пришел с ответом: «Выбрать | Создавайте пакеты среды выполнения. тогда все стало работать отлично

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

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

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


person VibeeshanRC    schedule 21.10.2010    source источник


Ответы (2)


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

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

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

person XBasic3000    schedule 21.10.2010
comment
когда я включил все эти объекты и скомпилировал внутри exe, потребовалось всего 2000 КБ памяти, поэтому я думаю, что все проблемы связаны с исполняемыми bpls - person VibeeshanRC; 21.10.2010
comment
просто скажите мне, как реализовать этот код, не выбирая сборку со средой выполнения в -_ ›параметры проекта | пакеты - person VibeeshanRC; 21.10.2010
comment
@Vibeeshan может быть потому, что вы добавили все bpl. попробуйте исключить некоторые неиспользуемые bpls. потому что он создает среду выполнения, даже если вы ее не используете. пример InterBaseDriver; DBXMySQLDriver; dbexpress; dbxcds; VirtualTreesD12 и т.д .. Я не использовал его, поэтому я не собираюсь его исключать. Попытайтесь узнать все единицы, к каким bpl они принадлежат. - person XBasic3000; 22.10.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;
person The_Fox    schedule 21.10.2010
comment
Привет, извините, я не могу использовать bpl, потому что другая часть программного обеспечения написана на vb, поэтому я должен использовать dll - person VibeeshanRC; 21.10.2010
comment
@Vibeeshan: я не думаю, что можно использовать TFrames с VB - person The_Fox; 21.10.2010