Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FreeLibary verursacht Absturz (https://www.delphipraxis.net/58160-freelibary-verursacht-absturz.html)

berens 2. Dez 2005 09:36


FreeLibary verursacht Absturz
 
Hi Leute!

Ich fange gerade richtig mit DLLs an und steige da nicht ganz dahinter:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  i: integer;
  blResult : function: boolean; stdcall;
begin
  while i = 0 do begin
    h1 := ConnectDLL('meinedll.dll');
    @blResult := GetProcAddress(h1, pchar('Start'));
    if (@blResult <> Nil) then blResult;
    end;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  blResult : function: Boolean; stdcall;
begin
  @blResult := GetProcAddress(h1, pchar('Stop'));
  if @blResult <> NIL then blResult;
  FreeLibrary(h1);
end;
In der DLL wird ein Thread mit Objekten erstellt, der sich beim Aufruf der "Stop" Funktion (Thread.Beenden:=True; Beim nächsten Thread.Execute wird die Schleife nicht mehr wiederholt; Thread.FreeOnTerminate=True) selbst beendet.

Rufe ich dann FreeLibary auf, ist es auch noch ok, aber in der Zeile dannach (end; (!) ???????) stürzt das Programm mit der Meldung:
---------------------------
Information
---------------------------
In Projekt C:\Dokumente und Einstellungen\name.MAX1337\Eigene Dateien\050218\_debug\Project2.exe trat ein Problem mit folgender Meldung auf: 'Zugriffsverletzung bei 0x7c9478bf: Schreiben von Adresse 0x01940ffc'. Prozeß angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------

Damit kann ich wie immer sehr viel Anfangen *Ironie*.

Hat irgendwer einen Tip woran das liegen könnte?

berens 2. Dez 2005 11:48

Re: FreeLibary verursacht Absturz
 
Wahrg mist, hatte eben den Debugger komplett aus und schon gefreut, dass ich keine Fehlermeldung mehr erhalte... *seufz*

Pfoto 2. Dez 2005 12:05

Re: FreeLibary verursacht Absturz
 
Ich weiß nicht, ob es damit zu tun hat, aber bei mir trat das gleiche Problem ebenfalls auf; nämlich dann, wenn ich das Programm beendet habe und den Thread freigeben wollte.

Dann habe ich den Befehl WaitFor entdeckt und eingesetzt, kurz bevor das Programm beendet werden sollte. Dadurch wartet es nun brav, bis der Thread fertig ist. (Vorher natürlich Termitate aufrufen)
Ab da kam dann keine Schutzverletzung mehr.


Gruß
Pfoto

berens 2. Dez 2005 12:21

Re: FreeLibary verursacht Absturz
 
Kann ich vielleicht in der DLL in der STOP Procedure nicht auf die Variable zugreifen, die ich in Start gesetzt habe?

Das andere hat leider bisher nicht geholfen. Bekommen nun "Handle ungültig" bei FreeLibrary:

DLL:
Delphi-Quellcode:
function Start: TThread; stdcall;
begin
  n := TMyThread.Create;
  n.Resume;
  Result := NIL
end;

procedure Stop; stdcall;
begin
  n.Beenden := true;
  n.WaitFor;
  // Nochmal neu:
  FreeAndNil(n);
end;
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  while not Self.Terminated and not beenden do begin
    // Mache was
  end;
  // Alle Komponenten des Threads hier freigeben etc.
  Self.Terminate;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz