Seite 1 von 1
Datei öffnen von Desktop -> Absturz
Verfasst: 30.06.2007 18:07
von schic
Hallo Zusammen,
ich habe folgendes Problem:
Beim Versuch mit den FileRequester (Open und Save) einen Dateinamen
vom Desktop zu holen, stürzt das Programm ab. Der Absturz tritt ein
wenn man mit derm Maus-Cursor einige Mal über die Dateinamen fährt.
Vom Debugger wird ein Invalid Memory Access gemeldet.
Der Fehler lässt sich selbst mit einem ErrorHandler nicht abfangen.
Das Phänomen tritt auf unter Windows XP und 2000 compiliert mit PB 4.02
und auch mit PB 3.94.
Hier ein Test-Code:
Code: Alles auswählen
Procedure ImportFile()
File$ = OpenFileRequester("Wählen Sie die zu importierende Datei", "", "Datei (*.xls)|*.xls", 0)
MessageRequester("!", File$)
EndProcedure
OpenWindow(0, 100, 100, 330, 200, "Open from Desktop", #PB_Window_SystemMenu |#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget| #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ButtonGadget(0,10,165,50,30,"open")
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 0 : ImportFile()
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
End
Der Absturz gelingt nicht immer zuverlässig, aber fast immer beim
zweiten Versuch.
Hat diesen Fehler noch jemand beobachtet, bzw. eine Erklärung/Lösung?
Gruß schic
Re: Datei öffnen von Desktop -> Absturz
Verfasst: 30.06.2007 18:11
von Kiffi
schic hat geschrieben:Hat diesen Fehler noch jemand beobachtet, bzw. eine Erklärung/Lösung?
kommt mir irgendwie bekannt vor...
Vielleicht hier?
http://www.purebasic.fr/german/viewtopi ... 9113#99113
Grüße ... Kiffi
Verfasst: 30.06.2007 18:31
von schic
Danke Kiffi für Deine Antwort.
Habe mir den langen Thread durchgelesen.
Richtig zufriedenstellend ist die Lösung von persepole aber nicht.
Scheint ein merkwürdiger Fehler zu sein. Ob das mit Win API zu
umgehen ist?
Verfasst: 01.07.2007 08:33
von Little John
Ich habe das gleiche Problem manchmal, ebenfalls nicht zuverlässig reproduzierbar, beim Versuch mit dem Visual Designer (der soweit ich weiß ja auch in PB programmiert ist) eine Datei zu öffnen -- Windows XP pro SP2 und PB 4.02 bzw. PB 4.10 beta 2.
Gruß, Little John
Verfasst: 01.07.2007 15:44
von schic
ich habe scheint´s eine Lösung in folgendem Thread im englischen Forum gefunden:
http://www.purebasic.fr/english/viewtop ... 068afb1aa9
Der Code von srod verursacht keinen Absturz. Die anderen schon.
Konnte aber nicht herausfinden woran es liegt.
Gruß schic
Verfasst: 01.07.2007 16:08
von Little John
Ich muss sagen das finde ich persönlich unbefriedigend. Das ist ziemlich viel Code um einen OpenFileRequester darzustellen, außerdem wird mindestens Windows 2000 benötigt. Ich habe allerdings leider nichts besseres.
Gruß, Little John
Verfasst: 01.07.2007 16:19
von schic
fügst Du
Code: Alles auswählen
If OSVersion() < #PB_OS_Windows_2000
\lStructSize = \lStructSize - 12
EndIf
ein, dann geht´s auch in älteren Windowsversionen.
Die 250 Zeilen Code würden mich nicht stören, aber inzwischen produziert
das auch wieder die gleichen Abstürze, wenn ich die Funktion von einem
Button aus aktiviere.
Schon sehr merkwürdig

Verfasst: 02.07.2007 20:13
von schic
Ich habe etwas rumgetestet und es wird immer eigenartiger.
Wenn in folgendem Code das EditorGadget aktiviert ist,
kann man mehrmals eine Datei auf dem Desktop mit
aktiven Tooltips, ohne Absturz wählen.
Hat das Fenster aber kein EditorGadget, gibt´s nen Absturz.
Code: Alles auswählen
Enumeration
#Window_0 = 1
EndEnumeration
;...OpenFileRequester constants
#CDN_INITDONE = #CDN_FIRST - 0
#CDN_SELCHANGE = #CDN_FIRST - 1
#CDN_FOLDERCHANGE = #CDN_FIRST - 2
#OFN_ENABLESIZING = $800000
#OFR_View_Report = $702C
#OFR_View_List = $702B
#OFR_View_Largeicon = $7029
#OFR_View_Thumbnail = $702D
#OFR_View_Thumbnail_2K = $7031
#OFR_View_Tile = $702E
Procedure.s GetOpenName(DialogTitle.s = "", InitialDir.s = "", Filter.s = "", DefaultExtension.s = "", flags.l = 0, hwndOwner.l = 0, ShowState = 0)
; Zeigt den Dialog "Datei öffnen" an und liefert
; den angegebenen Dateipfad zurück (bzw. einen leeren
; String bei Abbruch durch den Benutzer).
Protected OFN.OPENFILENAME
; comdlg32 = OpenLibrary(0, "comdlg32.dll")
; FuncGetOpenFileName = GetFunction(0, "GetOpenFileNameA")
With OFN
; Angabe der Größe der OPENFILENAME-Struktur
\lStructSize = SizeOf(OPENFILENAME)
; Falls OS < Windows 2000, die letzten drei
; Mitglieder der Struktur ausnehmen:
If OSVersion() <PB_OS_Windows_2000> 0
\lpstrDefExt = @DefaultExtension
EndIf
; Startverzeichnis des Dialogs
If Len(InitialDir) > 0
\lpstrInitialDir = @InitialDir
EndIf
; Titel des Dialogs
If Len(DialogTitle) > 0
\lpstrTitle = @DialogTitle
EndIf
; Eigenschaften des Dialogs
If flags = 0
\flags = #OFN_EXTENSIONDIFFERENT | #OFN_NOCHANGEDIR | #OFN_HIDEREADONLY | #OFN_EXPLORER | #OFN_ENABLESIZING
Else
\flags = flags | #OFN_EXPLORER
EndIf
; Bei Bedarf den Dialog-Hook aktivieren:
; If ShowState <> List
; ShowStateValue = ShowState
; \flags = \flags | #OFN_ENABLEHOOK
; \lpfnHook = @OFNHookFunc();@OFNHookProc()
; EndIf
; Filter-Trennzeichen "|" in NullChar wandeln
Filter + "||"
l = Len(Filter)
For n = 0 To l - 1
If PeekB(@Filter + n) = Asc("|")
PokeB(@Filter + n, $0)
EndIf
Next n
\lpstrFilter = @Filter
EndWith
; Aufruf und Auswertung von GetOpenFileName
GetOpenFileName_(@OFN)
;Ergebnis = CallFunctionFast(FuncGetOpenFileName, @OFN)
OpenName.s = PeekS(OFN\lpstrFile)
ProcedureReturn OpenName
EndProcedure
;/===============================================
;/ Procedure - Main Window
;/===============================================
If OpenWindow(#Window_0, 0, 0, 520, 320, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar) And CreateGadgetList(WindowID(#Window_0))
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; kein Absturz bei Dateiauswahl auf ;!!!
; Desktop mit aktiviertem EditorGadget ;!!!
;EditorGadget(1, 10, 10, 500, 140) ;!!!
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ButtonGadget(2,10,265,50,30,"open")
StringGadget(3,10,155,500,100,"")
quit = #False
;/===============================================
;/ Main Event Loop
;/===============================================
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 2
File$ = GetOpenName("titel", "", "xls|*.xls", "", #OFN_ALLOWMULTISELECT, WindowID(#Window_0))
SetGadgetText(3,File$)
EndSelect
Case #PB_Event_CloseWindow
quit = #True
EndSelect
Until quit
EndIf
End
Hat da jemand eine Erklärung dafür?
Verfasst: 01.08.2007 12:36
von ABBKlaus
vielleicht hilft
CoInitialize_(0) ?
Code: Alles auswählen
CoInitialize_(0)
Enumeration
#Window_0
#Button_0
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 258, 4, 600, 300, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Window_0))
ButtonGadget(#Button_0, 20, 250, 50, 20, "Select")
EndIf
EndIf
EndProcedure
Open_Window_0()
Repeat
Ev.l=WaitWindowEvent(10)
If Ev=#PB_Event_Gadget
Select EventGadget()
Case #Button_0
File$=OpenFileRequester("Select File","","Text (*.txt)|*.txt",0)
If File$
Debug File$
EndIf
EndSelect
EndIf
If Ev=#PB_Event_CloseWindow
Quit.l=#True
EndIf
Until Quit
End
CoUninitialize_()