Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigenes Package - Ungültige Zeigeroperation (https://www.delphipraxis.net/112018-eigenes-package-ungueltige-zeigeroperation.html)

angelika81 13. Apr 2008 13:58


Eigenes Package - Ungültige Zeigeroperation
 
Hallo!

Ich schaffe es einfach nicht, folgenden Fehler abzustellen:

Aus meinem Hauptprogramm heraus lade ich dynamisch ein Package. Diesem Package übergebe ich ein Objekt, welches ein bestimmtes Interfaces implementiert (als Schnittstelle zwischen Programm und Package).

Das Package speichert sich das Objekt ab und ruft zu einem späteren Zeitpunkt aus diesem Interface eine Methode auf:

Delphi-Quellcode:
procedure TfrmExcelImport.SpeicherImportierteKunden;
begin
  try
    FKundendaten.GetNaechsteFreieKundenNr; // FKundenten enthält das Objekt, welches das Interface implementiert
  except on E: Exception do
    ShowMessage('Die Kunden konnten nicht importiert werden: '+ E.Message);
  end;
end; // <--- drücke ich hier F7, kommt eine Invalid Pointer Exception
Nun tritt folgendes auf: Die Methode wird aufgerufen, in den except Bereich wird nicht gesprungen, wie ich im Debug-Modus sehe. Aber beim Ausstieg aus dieser Prozedur kommt der Fehler.
Ich hoffe, ihr könnt mir etwas weiterhelfen. Das würde mich wirklich freuen!

angelika

mkinzler 13. Apr 2008 14:02

Re: Eigenes Package - Ungültige Zeigeroperation
 
Zeig mal auch die Erzeugung des Objekts und den Aufruf der Methode

angelika81 13. Apr 2008 14:15

Re: Eigenes Package - Ungültige Zeigeroperation
 
Hallo,

Die Methode, welche im Hauptprogramm liegt, habe ich zur Fehlereingrenzung gekürzt und gebe dort einfach nur 5 zurück:
Delphi-Quellcode:
function TKundeDB.GetNaechsteFreieKundenNr: integer;
begin
  result := 5;
end;
FKundendaten wird in einer Singleton-Klasse gespeichert. Was ich gemerkt habe, ist folgendes:
Im Package zeige ich nun sofort den Ergebniswert an, den ich aus der Methode "GetNaechsteFreieKundenNr" aus dem Hauptprogramm bekomme, an:
Delphi-Quellcode:
ShowMessage(FKundendaten.GetNaechsteFreieKundenNr);
Dann wird die 5 ausgegeben, anschließend kommt aber eine "Access Violation in module rtl100.bpl". Das muss doch allgemein etwas mit der Speicherverwaltung zu tun haben, oder sehe ich das falsch? Denn vom Package auf das Programm per Interface funktioniert ja, wie ShowMessage zeigt.

mkinzler 13. Apr 2008 14:22

Re: Eigenes Package - Ungültige Zeigeroperation
 
Wie lädst du das Package?

angelika81 13. Apr 2008 14:33

Re: Eigenes Package - Ungültige Zeigeroperation
 
:)

So, hier lade ich das Package:

Delphi-Quellcode:
try
      pModule := LoadPackage(files.Strings[i]);
      @proc := GetProcAddress(pModule, 'Plugin');

      if not Assigned(proc) then
        raise EPackageException.Erzeugen('Fehler beim Laden');

      plugin := proc(files.Strings[i], FKundendaten); // <-- Hier übergebe ich einen String und das Objekt, welches das Interface implementiert
      FPluginListe.Add(plugin);
    except on E: Exception do
    begin
        UnloadPackage(pModule);
        raise E;
    end;
    end;

jbg 13. Apr 2008 14:46

Re: Eigenes Package - Ungültige Zeigeroperation
 
Zitat:

Zitat von angelika81
Delphi-Quellcode:
    except on E: Exception do
    begin
        UnloadPackage(pModule);
        raise E;
    end;
    end;

Das "raise E;" sollte besser ein "raise;" sein. Denn "raise;" wird vom Compiler in "Reraise" umgewandelt, wohingegen ein "raise E" einfach das bereits erzeugte Exception Objekt noch mal wirft. Diese wird nur dummerweise wegen dem fehlenden "Reraise" beim "end" des "except" Blocks freigegeben und du bekommst eine EAccessViolation um die Ohren geschlagen.

angelika81 14. Apr 2008 11:49

Re: Eigenes Package - Ungültige Zeigeroperation
 
Hallo!
Danke für die Tipps! Genau daran lag es! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 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