[Delphi] Jak wyładować dll z pamięci?

[Delphi] Jak wyładować dll z pamięci?
Dibo84
  • Rejestracja: dni
  • Ostatnio: dni
0

Napisałem plugina do jakiegos programu. Przy uruchomieniu pluga pobierane są rekordy do tablicy itp. Plugina zamykam ( Close() ; ) Jednak gdy go uruchomie ponownie dalej rekordy dalej są w tablicach, w editach dalej są wartosci, po prostu zamykana jest tylko forma ale wszystko dalej siedzi w ramie dopóki nie zrobie restarta całego programu. Jak taki plugin wyładować z pamieci gdy nie jest już potrzebny. Próbowałem Application.Terminate ale powodowało to zwis pluginu. Czy jeżeli "ręcznie" usune rekordy (SetLength(Tablica_Rekordu, -1) i wyczyszcze edity (Edit.Clear) to to cos zmieni? Wyładuje takze z pamieci? Jest to dla mnie ważne gdyż rekordy są ogromne

migajek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 370
0

a FreeLibrary ?:>

Dibo84
  • Rejestracja: dni
  • Ostatnio: dni
0

yyy, chyba cos nie bardzo wiem jak to zastosować. Pojawia sie :[Error] frmMainUnit.pas(208): Not enough actual parameters . Gdzie mam to użyć? Na formie czy w bibliotece? Tu i tam kompilator nie popuszcza :)

SZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3356
0

Skoro piszesz plugin, to aplikacja go obsługująca powinna wywoływać FreeLibrary. Być może nie wykonujesz zamknięcia pluginu, kiedy program tego żąda, albo w pamięci pozostawiasz jakieś śmieci, nie zwalniając jej.

migajek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 370
0
Dibo84 napisał(a)

yyy, chyba cos nie bardzo wiem jak to zastosować. Pojawia sie :[Error] frmMainUnit.pas(208): Not enough actual parameters . Gdzie mam to użyć? Na formie czy w bibliotece? Tu i tam kompilator nie popuszcza :)

FreeLibrary po zaladowaniu biblioteczki i uzyciu funkcji... w parametrze podajesz uchwyt ktory otrzymales przy ladowaniu

Dibo84
  • Rejestracja: dni
  • Ostatnio: dni
0

Ladowanie pluginów w tym programie chyba nie jest dynamiczne, nie moge znalezc uchwytu w SDK, w kazdym razie procedura otwierająca plugin w programie wyglada tak:

Kopiuj
procedure Init(Command: ShortString; Index: Integer); register;
begin
case Index of
  PLUG_TEST1:
    begin
      if not Assigned(frmMain) then
        begin
          frmMain := TfrmMain.Create(nil);
          Form1:= TForm1.Create(nil);
        end;
      frmMain.Show;
    end;
end;
end;

Dobra nie wazne, powiedzcie mi tylko czy takie coś chcociaż troche zwolni pamięć:

Kopiuj
ListView1.Clear;
SetLength(Dane, -1);
LabeledEditTemat.Clear;
RichEdit1.Clear;
migajek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 370
0
Dibo84 napisał(a)

Ladowanie pluginów w tym programie chyba nie jest dynamiczne, nie moge znalezc uchwytu w SDK, w kazdym razie procedura otwierająca plugin w programie wyglada tak:

Kopiuj
procedure Init(Command: ShortString; Index: Integer); register;
begin
case Index of
  PLUG_TEST1:
    begin
      if not Assigned(frmMain) then
        begin
          frmMain := TfrmMain.Create(nil);
          Form1:= TForm1.Create(nil);
        end;
      frmMain.Show;
    end;
end;
end;

Dobra nie wazne, powiedzcie mi tylko czy takie coś chcociaż troche zwolni pamięć:

Kopiuj
ListView1.Clear;
SetLength(Dane, -1);
LabeledEditTemat.Clear;
RichEdit1.Clear;

OMG ty chyba nie wiesz o czym piszesz ;)
Ten kod jest zupelnie bez sensu jesli nie znasz reszty :P
Co do setlength to chyba lepiej

Kopiuj
ZeroMemory(@dane,sizeOf(dane));
Dibo84
  • Rejestracja: dni
  • Ostatnio: dni
0

To prawda, mało wiem o bibliotekach :D , tylko że SDK jest tak ubogie że naprawde trzeba tylko skopiować kod z załączonego prykladu a reszte na formie robic, dzieki za setlength...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.