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.
:o

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_()