Invalid memory access

Anfängerfragen zum Programmieren mit PureBasic.
Little_Man
Beiträge: 3
Registriert: 03.06.2013 23:21

Invalid memory access

Beitrag 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
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Invalid memory access

Beitrag 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.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: Invalid memory access

Beitrag 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.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Little_Man
Beiträge: 3
Registriert: 03.06.2013 23:21

Re: Invalid memory access

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Invalid memory access

Beitrag 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
Little_Man
Beiträge: 3
Registriert: 03.06.2013 23:21

Re: Invalid memory access

Beitrag von Little_Man »

edel;

Ohne Close Library (0) bleibt das Problem IMA in linie: "End"
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Invalid memory access

Beitrag 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 ...
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten