![]() |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Exception-Klasse EOSError mit Meldung System Error. Code 1400. Ungültiges Fensterhandle. Application war auch zu Beginn nicht verfügbar, da die Unit Vcl.Forms nicht eingebunden war. Ich möchte jetzt sicher gehen, dass ich das korrekt verstanden hab: das soll schon in der DLL gesetzt werden, richtig? Nicht erst "während" des Konstruktors des eigentlichen TForm-Objekts? Da wäre es meiner Meinung nach nämlich zu spät, aber ich will da lieber nochmal nachfragen. Das sieht jetzt ungefähr so aus:
Delphi-Quellcode:
// In der DLL
procedure CreateSearch({... ;} AHnd: THandle); cdecl; begin Application.Handle := AHnd; // hier ist das ja korrekt oder? FDynamicSearchDlg := TFormDynamicSearchDialog.Create({...}); // hier als Parameter wäre zu spät, richtig? // usw. end; // Im DLL-Interface (-> außerhalb der DLL, in der EXE drinnen sozusagen) CreateSearch({...;}, Application.Handle); |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Du kannst ja außen herum noch einmal ein try..except setzen oder ähnliches, wenn du die Fehlerursache im Konstruktor nicht abstellen kannst, aber beim try..finally darf die Erstellung des Objekts aus dem genannten Grund nicht im try-Block stehen. |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Das was du jetzt erwähnst, würde ja bedeuten, dass der "eigene" Konstruktor zwar abgebrochen würde, der vom TObject aber nicht. Wie himitsu in einem vorherigen Post erläutert hat, beginnt die Erzeugung des TObjects tatsächlich ja schon vor dem "begin". D.h. "eigene" Klassen machen nach dem
Delphi-Quellcode:
noch eigenes Zeug, was dann u.U. eine Exception auslöst. Wenn das passiert, wird doch dann ein Memory Leak existieren, oder? Ich muss also, um diesen Leak zu eliminieren, irgendwo ein Free aufrufen, damit zumindest das TObject (und je nach Vererbung auch alle höheren Instanzen) wieder sauber zerstört wird.
inherited Create
|
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Da dein Formular von TForm abgeleitet ist, muss die Unit Forms zumindest da schon eingebunden sein. ![]() Modale Formulare vorher zu erzeugen und nur bei Bedarf anzuzeigen ist in der Regel nicht sinnvoll. Diese werden häufig nach diesem Schema benutzt:
Delphi-Quellcode:
Wenn tatsächlich im Contructor ein Fehler auftreten kann, sollte man das zusätzllich mit try..except absichern.
procedure ShowMyDialogForm(var AMyData: TMyData): Boolean;
var F: TMyDialogForm; // globale Variable ist für Dialoge nicht erforderlich begin F := TMyDialogForm.Create(nil); // Owner = nil, wir übernehmen selbst die Freigabe des Dialogs try {Daten übergeben zur Anzeige/Bearbeitung z.B.} F.Data := Copy(AMyData); Result := (F.ShowModal = mrOk); {geänderte Daten übernehmen} if Result then AMyData := Copy(F.Data); finally F.Free; end; end; F wird dann nicht zugewiesen und der Resourcenschutzblock try..finally komplett nicht durchlaufen. Man solllte Objekte immer auf der Ebene freigeben, wo diese auch erzeigt wurden, insbesondere aber nur an einer Stelle. |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Parameter als PChar sind problemlos verwendbar, solange die übergebenen Zeichenketten in der DLL nicht verändert werden.
Wieder auf String casten und dann verändern ist nicht zulässig. Rückgabewerte aus der DLL als PChar sind problematisch. Solange der Rückgabewert auf eine Constante oder einen Resourcestring verweist, ist das ok.
Delphi-Quellcode:
function MyDLLFunction(): PChar;
const sc = 'ConstText'; var s: string; begin s := MyInternFunction; Result := PChar(s); // unzulässig da "s" nach verlassen der Funktion eventuell nicht mehr existiert // <- wenn Referenzzähler von s auf 0 fällt, wird der String freigegeben, Result enthält einen ungültiger Zeiger s := sc; Result := PChar(s); // zulässig da "s" auf eine Konstante verweist // Referenzzähler von String-Konstanten ist immer -1 end; |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Man muss nur darauf achten, dass auf beiden Seiten das gleiche PChar verwendet wird, oder besser gleich auf beiden Seiten PAnsiChar oder PWideChar, dann ist es eindeutig. |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Kannst du vielleicht ein Beispielprojekt erstellen, das nur die DLL-Funktion aufruft? Wenn dann der Fehler noch passiert, kannst du ja vielleicht alles aus der DLL herauswerfen, das du nicht posten möchtest, solange der Fehler noch auftritt.
Denn mit einem funktionierenden Beispiel ließe sich das Problem hier sicher ganz schnell lösen. Zitat:
Der Vorteil, den du in diesem Konstrukt siehst, ist zwar nachvollziehbar, kann aber in der Realität nie (!) eintreten. Deshalb sollte man sich besser an den Standard halten. Der hat schon seinen Sinn. |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Ich hab jetzt aber dort, wo ich den Erben von TForm instanziiere, das Obkekt Application verwenden sollen und da brauchte ich bisher die Unit Vcl.Forms noch nicht. Daher hab ich sie jetzt erst eingebunden. Aber wie ich ja sagte: ich erhalte eine invalid handle value Exception. Und das während der Konstruktion des Objekts TFormDynamicSearchDialog. Ich glaub es war bei der Erzeugung des PageControl-Components, bin mir aber nicht mehr sicher. Was mache ich denn jetzt damit? Die Hauptapplikation ist ja die EXE-Anwendung und die läuft natürlich schon. Oder hast du damit gemeint, dass ich das Handle-Value nach der Erzeugung des Objekts TFormDynamicSearchDialog erst setzen soll? Zitat:
|
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
|
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz