AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Access Violation bei TOpenFileName
Thema durchsuchen
Ansicht
Themen-Optionen

Access Violation bei TOpenFileName

Ein Thema von Chewie · begonnen am 22. Aug 2002 · letzter Beitrag vom 23. Aug 2002
Antwort Antwort
Seite 1 von 2  1 2      
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

Access Violation bei TOpenFileName

  Alt 22. Aug 2002, 22:53
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)
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von RomanK
RomanK

Registriert seit: 7. Jun 2002
Ort: Kirchheim unter Teck
1.036 Beiträge
 
Delphi 7 Personal
 
#2
  Alt 22. Aug 2002, 22:57
HI vielleicht
Code:
OFN.Free;
Roman Keller
Krieg ist Gottes Art den Amerikanern Geographie beizubringen!
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 22. Aug 2002, 23:08
Zitat von FuckRacism:
HI vielleicht
Code:
OFN.Free;
Ne, geht nicht. OFN ist ja ein Record und keine Klasse, die von TObject abgeleitet ist.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 22. Aug 2002, 23: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
für den letzten Satz war ich zu spät
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von RomanK
RomanK

Registriert seit: 7. Jun 2002
Ort: Kirchheim unter Teck
1.036 Beiträge
 
Delphi 7 Personal
 
#5
  Alt 22. Aug 2002, 23: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
Roman Keller
Krieg ist Gottes Art den Amerikanern Geographie beizubringen!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 22. Aug 2002, 23:26
Moin Roman,

deshalb sagte ich ja: Im Prinzip richtig
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7
  Alt 23. Aug 2002, 00:08
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 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 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 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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#8
  Alt 23. Aug 2002, 00:11
Mist, die Fehlermeldung kommt jetzt nicht mehr, aber jetzt wird nichts mehr in den Puffer hineingeschrieben Muss mich morgen noch mal damit befassen.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9
  Alt 23. Aug 2002, 02: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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#10
  Alt 23. Aug 2002, 13:41
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 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