Seite 1 von 1

Invalid memory access

Verfasst: 04.06.2013 22:19
von Little_Man
Hallo,
Iich habe ein Problem und konnte es bisher nicht lösen...

Nach der Zugabe von ein paar Zeilen Code in "MainScreen.pb":
A.) ButtonGadget (# Main_B_03, .........
B.) Case # Main_B_03 ; E-Mail erstellen.
Define sMailAddress.s, sMailSubject.s
sMailAddress.s = "username@provider.country"
sMailSubject.s = "Testing e-mail"
ShellExecute_ (Null # # Null "mailto:" + sMailAddress + "? Subject =" + SMailSubject.s, # NULL, NULL #, # SW_SHOWNORMAL)

Beim ersten Start des Programms und begleitet "E-Mail erstellen" gibt keinen Fehler, im Folgenden "Programm beenden".

Ab der zweiten Zeit des Programms und begleitet "Suche Kontakt", "Zurück zum Hauptmenü"", "E-Mail erstellen",
die Standard-Mail-Programm wird gestartet und gibt dem Programm einen Fehler in der folgenden Zeile:
Event = WaitWindowEvent()

[ERROR] MainScreen.pb (Line 35)
[ERROR] Invalid memory access (read error at address 268451016).

Code: Alles auswählen

; MainScreen.exe.

EnableExplicit

Enumeration
  #MainScreen
  #Main_B_01: #Main_B_02: #Main_B_03
EndEnumeration

Global Year   = 2014
Global Month  = 4
Global Day    = 9
Global Build  = #PB_Editor_BuildCount

Global ScreenHeight = 693
Global ScreenWidth  = 730
Global Version.s    = " v." + Str(Year) + "." + Str(Month) + "." + Str(Day) + " - " + "Build" + " " + Str(Build)
Global Style.l      = #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_TitleBar

Global FontID0 = LoadFont(0, "Verdana", 8)
Global Event.l
Global Result = 0

Procedure Main_Screen()
  OpenWindow(#MainScreen, 0, 0, ScreenWidth, ScreenHeight, " " + "Kontakte Management" + Version.s  + ".", Style.l)
  ButtonGadget(#Main_B_01, 265, 498, 240, 25, "Suche Kontakt"): SetGadgetFont(#Main_B_01, FontID0)
  ButtonGadget(#Main_B_02,  15, 663, 490, 25, "Programm beenden"):    SetGadgetFont(#Main_B_02, FontID0)
  ButtonGadget(#Main_B_03,  15, 566, 240, 25, "E-Mail erstellen"):  SetGadgetFont(#Main_B_03, FontID0)
EndProcedure

Main_Screen()

Repeat
  Event  = WaitWindowEvent()    ; ;<-- FEHLER NACH: "Suche Kontakt" --> "Zurück zum Hauptmenü" --> "E-Mail erstellen" !!...
  
  Debug Event
  
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
         
        Case #Main_B_01   ; Suche Kontakt.
          HideWindow(#MainScreen, #True)
          OpenLibrary(0, "SearchContact.dll")
          Result = CallFunction(0, "SearchScreen", Year, Month, Day, Build)
          Debug PeekS(Result)
          CloseLibrary(0)
          HideWindow(#MainScreen, #False)
 
        Case #Main_B_02   ; Programm-Ende.
          End
          
        Case #Main_B_03   ; E-Mail erstellen.
          Define sMailAddress.s, sMailSubject.s
          sMailAddress.s = "username@provider.country"
          sMailSubject.s = "Testing e-mail"
          ShellExecute_(#Null, #Null, "mailto:" + sMailAddress + "?Subject=" + sMailSubject.s, #Null, #Null, #SW_SHOWNORMAL)          

      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow
End

Code: Alles auswählen

; SearchContact.dll.

Enumeration
  #Search_Screen
  #Search_B_01
EndEnumeration

ProcedureDLL.s SearchScreen(Year, Month, Day, Build) 
  
  Protected A$

  Protected Style.l      = #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_TitleBar
  Protected ScreenHeight = 700
  Protected ScreenWidth  = 693

  Protected FontID0 = LoadFont(0, "Verdana", 8)

 A$ ="Suche Kontakt"

  OpenWindow(#Search_Screen, 0, 0, ScreenHeight, ScreenWidth, " " + "Suche Kontakt" + " v."+ Str(Year) + "." + Str(Month) + Str(Day) + " - Build " +Str(Build), Style.l)
  ButtonGadget(#Search_B_01,  15, 663, 490, 25, "Zurück zum Hauptmenü"): SetGadgetFont(#Search_B_01, FontID0)

  Repeat
  Protected Event  = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()

        Case #Search_B_01   ; Zurück zum Hauptmenü.
          CloseWindow(#Search_Screen)
          ProcedureReturn A$
         
      EndSelect
  EndSelect
  Until Event = #PB_Event_CloseWindow
EndProcedure
Hat jemand eine Idee?

Danke,
Little_Man

Re: Invalid memory access

Verfasst: 04.06.2013 22:42
von HeX0R
Ich gehe mal davon aus, Deine Muttersprache ist nicht Deutsch?

Versuche mal Dein A$ in der DLL, so wie in der Hilfe extra beschrieben, Global zu machen.

Re: Invalid memory access

Verfasst: 05.06.2013 01:06
von jojo1541
Ich hab mal deine Schritte zurückverfolgt, kann aber bei mir keinen IMA feststellen. Probier es doch mal mit dem Purifier, dadurch werden Speicherfehler wesentlich deutlicher sichtbar. :wink:

Aber bist du sicher, dass du die dll bei jedem Druck auf den Button laden und wieder schließen möchtest? lade sie doch lieber nur einmal bei Programmstart und gebe sie bei Programmende frei.

Re: Invalid memory access

Verfasst: 06.06.2013 18:16
von Little_Man
HeX0R:
Multiculturele Samenleven --> Nederland.

jojo1541:
Vielen Dank für Ihre Antwort,

Angepasst im Code:
"Lade bei Programmstart und gebe sie bei Programmende frei."

Auf einem PC mit "W7 Home Premium - x64" gibt es keine Probleme mehr.
Aber auf einem "PC Vista Home Premium - x86" gibt einen Fehler in der folgenden Zeile:

Case # Main_B_02; Programm-One.
   CloseLibrary(0)
   End <-- IMA

Re: Invalid memory access

Verfasst: 06.06.2013 18:54
von edel
Funktioniert es denn ohne CloseLibrary(0)?
Das Programm gibt den benutzten Speicher am Ende frei, auch ohne ein extra CloseLibrary.

Vielleicht guckst du auch mal hier rein :
[Done] Possible stack corruption with OpenWindow() in DLL

Re: Invalid memory access

Verfasst: 06.06.2013 20:33
von Little_Man
edel;

Ohne Close Library (0) bleibt das Problem IMA in linie: "End"

Re: Invalid memory access

Verfasst: 06.06.2013 20:43
von ts-soft
Mach A$ global, nutze für das Fenster und den Button in der DLL #PB_Any, lade und entlade die DLL nur einmal,
und wenn das Problem weiterhin besteht, warte auf die nächste PB Version, weil:
http://www.purebasic.fr/english/viewtop ... =4&t=54041 :wink:

Gruß
Thomas

//edit:
bevor ich es vergesse, bitte Prototypes nutzen und nicht dieses veraltete Callfunction ...