Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Access Violation bei TOpenFileName (https://www.delphipraxis.net/689-access-violation-bei-topenfilename.html)

Chewie 22. Aug 2002 21:53


Access Violation bei TOpenFileName
 
Ich benutze folgende TOpenFileName-Struktur in meinem nonVCL-Programm:
Code:
OFN.lStructSize := SizeOf(OpenFileName);
OFN.hWndOwner := Hnd;
OFN.hInstance := hInstance;
OFN.lpstrFilter := DataInput_Filter;
OFN.lpstrCustomFilter := nil;
OFN.nMaxCustFilter := 0;
OFN.nFilterIndex := 0;
OFN.nMaxFile := 256;
OFN.nMaxFileTitle := 256;
OFN.lpstrFile := @FileName;             { markiert }
OFN.lpstrFileTitle := @FileTitle;       { markiert }
OFN.lpstrInitialDir := 'C:\';
OFN.lpstrTitle := 'Quelldatei auswählen';
OFN.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_READONLY;
Das funktionniert ohne Probleme, solange das Programm läuft. Aber wenn ich es beende, bekomme ich eine Access-Violation. Wenn ich oben markierte Annweisungen auskommentiere, triit dies nicht auf. Die Puffergröße müsste groß genug sein, denn die Funktion GetOpenFileName liefert ja True zurück. Aus dem PSDK werd ich nicht so ganz schlau, ob oben genannte Felder eine Initialisierung brauchen. Wäre also ganz scönn, wenn mir jemand helfen könnte.[/code]

Nachtrag: Auch wenn man es sich wahrscheinlich denken kann, wollte ich doch noch sagen, dass der Fehler nur auftritt, wenn diese Struktur als Parameter einer GetOpenFileName-Funktion aufgerufen wird.
Und da der Fehler nach dem Senden der WM_DESTROY-Nachricht auftaucht, sag ich noch, dass bei WM_DESTROY lediglich steht:
Code:
PostQuitMessage(0)

RomanK 22. Aug 2002 21:57

HI vielleicht
Code:
OFN.Free;

Chewie 22. Aug 2002 22:08

Zitat:

Zitat von FuckRacism
HI vielleicht
Code:
OFN.Free;

Ne, geht nicht. OFN ist ja ein Record und keine Klasse, die von TObject abgeleitet ist.

Christian Seehase 22. Aug 2002 22:17

Moin Chewie,

ich vermute mal, dass Du den Speicher für die Struktur mit GetMem oder AllocMem zuweist.
Wie werden denn die variablen Strings deklariert und initialisiert?
(DataInput_Filter, FileName, FileTitle)

DataInput_Filter müsste ja ein PChar, die anderen beiden als String deklariert sein (so wie Du sie verwendest).
Obwohl des bei Strings ja @FileName[1], bzw. @FileTitle[1] heissen müsste, damit's funktioniert.

Zu guter Letzt:
Werden denn die reservierten Speicherbereiche auch alle wieder freigegeben?
(DataInput_Filter und ggf. OFN)

BTW: Hast Du Dir die Struktur selber definiert?

@Roman:
Im Prinzip richtig, nur ist OFN kein Objekt, sondern ein Record.

EDIT
:oops: für den letzten Satz war ich zu spät

RomanK 22. Aug 2002 22:24

Hab ichs mir doch gedacht wäre ja komisch wenn das gestimmt hätte, ich wollte eigentlich damit nur sagen dass er den Speicher wieder "Freigeben" muss

Christian Seehase 22. Aug 2002 22:26

Moin Roman,

deshalb sagte ich ja: Im Prinzip richtig ;-)

Chewie 22. Aug 2002 23:08

Zitat:

Zitat von Christian Seehase
Ich vermute mal, dass Du den Speicher für die Struktur mit GetMem oder AllocMem zuweist.

Eigentlich nicht. Da ich bei Records dies eigentlich noch nie gebraucht hab, hab ich es hier auch nicht gemacht. Sollte ich das trotzdem tun?

Zitat:

Zitat von Christian Seehase
Wie werden denn die variablen Strings deklariert und initialisiert?
(DataInput_Filter, FileName, FileTitle)

DataInput_Filter müsste ja ein PChar, die anderen beiden als String deklariert sein (so wie Du sie verwendest).
Obwohl des bei Strings ja @FileName[1], bzw. @FileTitle[1] heissen müsste, damit's funktioniert.

DataInputFilter ist eine String-Konstante, FileName und -Title String-Variablen.

Zitat:

Zitat von Christian Seehase
Zu guter Letzt:
Werden denn die reservierten Speicherbereiche auch alle wieder freigegeben?
(DataInput_Filter und ggf. OFN)

Das würde ich gerne tun, das Problem ist aber, dass beim Freigeben eine InvalidPointer-Exception auftritt. Liegt vielleicht daran, dass ich gar keinen Speicher reserviere. Ich weiß nämlich nicht genau, wie. Wenn ich als ersten Parameter @OPN übergeben will, kommt die Fehlermeldung "Der linken Seite kann nichts zugewiesen werden.". Aber ist jetzt nicht mehr so wichtig, dennn wenn ich statt @FileName @FileName[1] nehme, klappt es. Also vielen Dank für die Hilfe.

Zitat:

Zitat von Christian Seehase
BTW: Hast Du Dir die Struktur selber definiert?

Nein, hab ich nicht, sie ist in der CommDlg.pas definiert und wird für die von Windows erstellten Open- und Savedialoge verwendet.

Chewie 22. Aug 2002 23:11

Mist, die Fehlermeldung kommt jetzt nicht mehr, aber jetzt wird nichts mehr in den Puffer hineingeschrieben :( Muss mich morgen noch mal damit befassen.

Luckie 23. Aug 2002 01:02

Darf ich dich mal auf meine HP verweisen oder warst du da schon?

Ich hätte da keine Strings genommen sondern Char-Arrays. Du kannst auch PChar nehmen nur dann mußt du erst Speicher reservieren und wieder freigeben.

Chewie 23. Aug 2002 12:41

Zitat:

Zitat von Luckie
Darf ich dich mal auf meine HP verweisen oder warst du da schon?

Danke, da war ich schonn. Ich hab mir deine Tutorials angeschaut und bin deswegen auch auf dieses OpenFileName gestoßen. Ich habs mir aber nicht angekuckt, wie das gemacht hast, sondern ich hab nur ins PSDK geschaut. Ich habe jetzt anstatt des Strings ein Array of Char benutzt, und jetzt scheint es zu funktionieren. Danke vielmals.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz