[Delphi] Błąd przy wyłączaniu programu

0

Witam.
Podczas wyłączania aplikacji wyrzuca mi bład o treści:
Exeption EInvalidPointer in module program.exe at 0000394D. Invalid pointer operation

Po tym komunikacie wyskakuje tabelka generowana przez turbodelphi:
... Exeption class EListError with message 'List index out of bounce (-1)'.

Używam biblioteki .dll, inicjowałem ją już na innym programie i działała. Jednak jedyną zmianą jaką wprowadziłem, było usunięcie z interfejsu akcji programu. Oto procedury inicjujące, kończące itp. borlandmm.dll umieściłem w katalogu biblioteki i wszystkie moduły mają zdeklarowane jako pierwsze ShareMem.

Interfejs:

unit aplikacja_intf;
interface
uses ShareMem,Dialogs;

type
   IBiblIntf = interface
       ['{B13BFD1D-CD0F-4B0E-A810-1018E2B1F203}']
       procedure Test();
   end { IBiblIntf };

implementation
end.

Wywołanie wtyczki z poziomu programu i zamknięcie:

procedure Biblioteka_Laduj();
begin
 { Najpierw ładuję bibliotekę do pamięci }
 hLib := LoadLibrary('optyk32.dll');
 if  hLib = 0  then
 begin
  RaiseLastOSError();
  Abort()
 end ;
 { Pobieram z biblioteki funkcje "Connect" i "Disconnect" }
 fnConnect := GetProcAddress(hLib, 'Connect');
 fnDisconnect := GetProcAddress(hLib, 'Disconnect');
 if  (@fnConnect = nil) or (@fnDisconnect = nil)  then
 begin
  ShowMessage('Niepoprawna wtyczka');
  Abort()
 end ;
end;

procedure Biblioteka_Zwolnij();
begin
 Disconnect();
 { Zwalniam interfejsy }
 iBibl := nil;
 FreeLibrary(hLib)
end;

Również potrzebne przy wywołaniu procedury Connect i Disconnect.

procedure Connect(out   iBibl:  IBiblIntf);
begin
 giBibl := TOptyk32Impl.Create();
 { Przekazuję implementację wtyczki do programu }
 iBibl := giBibl;
end;

procedure  Disconnect();
begin
 { Zwalniam interfejsy }
 giBibl := nil;
end;

Dodam, że uruchamiać - uruchamia się poprawnie. Problem ten występuje po wyłączeniu programu. Próbowałem zwalniać w momencie CloseQuery wraz z Application.Terminate, ale nic nie pomogło.

Nie wiem, co jeszcze może się przydać. Mam nadzieje, że ktoś pomoże. Moze to wina jakiejś procedury, ale wątpie bo żadnej nie wywołuje. Ograniczyłem się jedynie do inicjacji biblioteki do pamięci.

Pozdrawiam
intacto_

0

A leciałeś krok po kroku?

0

A leciałeś krok po kroku?

0

Tego typu błedy pojawiają się podczas nielogicznnego zamykania. Ten błąd wskazuje , że próbujesz zamknąć coś co już zostało zamknięte. Delphi ma automatyczne metody zamykania obiektów i należy sprawdzić czy Ty nie prubujesz zamknąć coś co zostało zamknięte przez Ciebie. Jak to wygląda w rzeczywistości jeśli ucinasz gałąź a potem prubujesz jeszcze coś ucinać na spadającej gałęzi to jest to mało realne. W przypadku programu Pan każe sługa wykonuje :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0