Auffälligkeit mit Speicherverhalten

Anfängerfragen zum Programmieren mit PureBasic.
RE62
Beiträge: 8
Registriert: 21.05.2025 22:23

Auffälligkeit mit Speicherverhalten

Beitrag von RE62 »

Hallo, mit dem folgenden Mini-Programm möchte ich hier gerne mal zeigen, zu welchem Problem es kommt, wenn man die exe dazu anstatt mit Doppelklick zur Abwechslung mal als Administrator öffnet. Der Code:

Code: Alles auswählen

If OpenWindow(1,0,0,340,200,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered) = 0 ; 412
   MessageRequester("OpenWindow failed", "")
EndIf

ButtonGadget(0,50,50, 100, 30, "Write File") 
ButtonGadget(1,190,50, 100, 30, "Delete File")

auf = 1

Repeat
  event = WaitWindowEvent(1)
  
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
      
        Case 0
          test$ = "Wert"
          If CreateFile(0,"C:\test$")
            WriteString(0,test$)
            CloseFile(0)
            auf = 1
          EndIf
          
        Case 1
          DeleteFile("C:\test$") 
          auf = 1
          
      EndSelect
  EndSelect
  
  If auf = 1
    auf = 0
    OpenFile(0,"C:\test$")
    test$ = ReadString(0)
    CloseFile(0)
    StringGadget(2,120,125,100,30,test$)
  EndIf
  
Until event = #PB_Event_CloseWindow


Und jetzt der Test:

1. Ich erstelle eine exe und öffne sie dann mit Doppelklick
2. Ich klicke "Write File" und fülle das StringGadget mit dem Inhalt "Test"
2. Ich schließe die exe und öffne sie erneut mit Doppelklick
3. Im StringGadget steht nun erwartungsgemäß "Test"

4. Ich schließe die exe
5. Ich öffne die exe erneut, aber diesmal als Administrator
6. Das StringGadget ist leer

Wenn man die exe als Administrator öffent, wird übrigens die Datei "C:/test$" an ihrem Speicherort voll sichtbar (wieso eigentlich?), während sie vorher noch ausgeblendet war. Und die Datei "C:/test$" kann dann nur noch mit Administratorrechten gelöscht werden, obwohl sie ja ohne Administratorrechte erstellt worden war.

Ist zwar nur ein Testprogramm, aber trotzdem zeigt das ja, wie Windows da einen Strich durch die Rechnung macht. Oder geht das irgendwie zu verhindern? Ich meine, daß der Zugriff auf bereits gespeicherte Dateien immer reibungslos funktioniert, auch wenn man zwischendurch das Programm als Administrator ausführt. Das ist nunmal ein Feature von Windows. Danke für Info.
Benutzeravatar
HeX0R
Beiträge: 3042
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: Auffälligkeit mit Speicherverhalten

Beitrag von HeX0R »

Windows hat Root-Access auf C:\ schon ewig nur noch für Admins erlaubt.
Ich wüsste auch nicht, wieso irgendein Programm unbedingt dort was speichern müsste.
Kam Dein Beispielcode eigentlich von Chat-GPT?
RE62
Beiträge: 8
Registriert: 21.05.2025 22:23

Re: Auffälligkeit mit Speicherverhalten

Beitrag von RE62 »

"Ich wüsste auch nicht, wieso irgendein Programm unbedingt dort was speichern müsste"

Haben andere auch schon gemacht, aber muß natürlich nicht sein - aber Chat-GPT scheint das dann ja auch OK zu finden :mrgreen: War ja auch nur ein Test.
Benutzeravatar
HeX0R
Beiträge: 3042
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: Auffälligkeit mit Speicherverhalten

Beitrag von HeX0R »

Eigentlich kam meine Vermutung, dass es sich um KI-generierten Code handelt, gar nicht auf Grund des Speicherortes, sondern wegen des Murks-Codes an sich.
RE62
Beiträge: 8
Registriert: 21.05.2025 22:23

Re: Auffälligkeit mit Speicherverhalten

Beitrag von RE62 »

Wie würdest du das denn machen? Ich meine, effektiv besseren Code und keine Wissenschaft. Ich habe halt keinen Berufsprogrammierer in meinem Bekanntenkreis.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Auffälligkeit mit Speicherverhalten

Beitrag von NicTheQuick »

Hier mal ein paar Kommentare zum Code aus meiner Sicht.

Code: Alles auswählen

If OpenWindow(1,0,0,340,200,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered) = 0 ; 412
	MessageRequester("OpenWindow failed", "")
	; Hier wird zwar meien Fehlermeldung ausgegeben, aber das Programm geht danach trotzdem weiter anstatt sich zu beenden.
EndIf

ButtonGadget(0,50,50, 100, 30, "Write File") 
ButtonGadget(1,190,50, 100, 30, "Delete File")

; Für was steht 'auf'?
auf = 1

Repeat
	; Warum wird hier ein Timeout von 1ms benutzt? Man braucht es in diesem Fall nicht.
	event = WaitWindowEvent(1)
	
	Select event
		Case #PB_Event_Gadget
			Select EventGadget()
					
				Case 0
					test$ = "Wert"
					If CreateFile(0,"C:\test$")
						WriteString(0,test$)
						CloseFile(0)
						auf = 1
					EndIf
					
				Case 1
					DeleteFile("C:\test$") 
					auf = 1
					
			EndSelect
	EndSelect
	
	If auf = 1
		auf = 0
		; Warum wird hier der Rückgabewert nicht geprüft? Und warum kein ReadFile, sondern OpenFile?
		OpenFile(0,"C:\test$")
		test$ = ReadString(0)
		CloseFile(0)
		; Das StringGadget wird immer wieder neu erzeugt anstatt es einmal am Anfang zu erstellen.
		StringGadget(2,120,125,100,30,test$)
	EndIf
	
; Warum wird hier auf den Event reagiert anstatt im obigen Select zu machen, wo man es eher erwarten würde?
Until event = #PB_Event_CloseWindow
RE62
Beiträge: 8
Registriert: 21.05.2025 22:23

Re: Auffälligkeit mit Speicherverhalten

Beitrag von RE62 »

ReadFile() statt OpenFile() wundere ich mich jetzt selber, aber ist doch in dem Fall auch eigentlich egal, oder? Event habe ich genau so gemacht, wie man das in PB-Nachschlagewerken liest. Und die unterste Programmzeile ist ja obligatorisch, um das Fenster wieder zumachen zu können. Das mit dem StringGadget jedesmal neu ist natürlich blöd, das stimmt, aber ich hatte gestern auch total wenig Zeit.

edit: Die Variable "auf" ist dazu, damit der Teil nur einmal durchlaufen wird. Danke für den Hinweis zu OpenWindow()
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Auffälligkeit mit Speicherverhalten

Beitrag von NicTheQuick »

Ein `OpenFile()` öffnet die Datei auch zum Schreiben, weswegen sich ihre Dateirechte ändern könnten, wenn man das Programm als Administrator startet. Bei `ReadFile()` passiert das nicht. Ich hab natürlich verstanden, was `auf` macht, der Name der Variable ist allerdings nichtssagend für mich. Das war die einzige Kritik daran.

Und die Kommentare sollte eher auf ChatGPT abzielen, das du ja anscheinend benutzt hast. Ich bin sicher, dass du mit mehr Zeit auch etwas sauberer programmierst. :)

Wegen der Event-Schleife: Natürlich hat da auch jeder ein bisschen seinen eigenen Stil. Ich bevorzuge z.B. eine `Repeat: ForEver`-Schleife und packe alle Events, auf die ich reagieren möchte, in das eine große `Select event`, damit alles an einem Platz ist, den man schnell überblicken kann. Natürlich geht es auch, wenn es im `Until event = ...` steht.
Axolotl
Beiträge: 274
Registriert: 31.12.2008 16:34

Re: Auffälligkeit mit Speicherverhalten

Beitrag von Axolotl »

RE62 hat geschrieben: 26.05.2025 14:40 Wie würdest du das denn machen? Ich meine, effektiv besseren Code und keine Wissenschaft. Ich habe halt keinen Berufsprogrammierer in meinem Bekanntenkreis.
Nun ja, diese Frage führt natürlich vom Thema weg, aber ich würde es so machen, weil ich meine eigenen "Coding Rules" habe.
Ich möchte hier allerdings keine Diskussion über Style Guides und Coding Rules lostreten. Deshalb: Jeder so wie er möchte.
Für mich ist eben die Fehlerminimierung und Wartbarkeit wichtig.
+ EnableExplicit immer, um Schreibfehler zu finden
+ Sprechende Namen für Variablen, Konstanten, usw. helfen mir (auch nach Jahren) den Code gleich zu verstehen.
+ Kommentare nur zur Strukturierung und da wo sie eine (kompliziertere) Logik erklären.
+ Konstanten anstatt direkter Werte vermeiden Fehler bei späteren Änderungen
+ Proceduren für (wiederverwendbare) Aufgaben und zur Strukturierung
+ ...

Beispiele in der Hilfe und im Forum sind oft auf das wesentliche reduziert, deshalb a.m.S. immer an die eigenen Bedürfnisse anzupassen.
Das folgende Beispiel zeigt meine Umsetzung ohne dass ich jetzt etwas am Program verändert habe. Nicht wundern, ich programmiere nur in Englisch!

Code: Alles auswählen

EnableExplicit  

; --- Program Constants --- 

#ProgramCaption       = "My Test App" 
#ProgramVersion       = "0." + #PB_Editor_BuildCount + "." + #PB_Editor_CompileCount 
#ProgramMainCaption   = #ProgramCaption + " " + #ProgramVersion 


Enumeration EWindow 1  ; <= my coding style, up to you 
  #WND_Main 
EndEnumeration 

Enumeration EGadget 1 
  #GDT_strFileContent 
  #GDT_btnWriteFile 
  #GDT_btnDeleteFile 
EndEnumeration 

Enumeration EFile 1 
  #FILE_In 
  #FILE_Out 
EndEnumeration 

; --- Constants --- 

#Filename = "C:\test$"  ; <= !! bad naming !! 


; --- File Access ----

Procedure WriteTextTofile(Filename.s, Text.s)  ; Text.s or Text$ is a matter of taste 
	If CreateFile(#FILE_Out, Filename) 
		WriteString(#FILE_Out, Text) 

    CloseFile(#FILE_Out) 
	EndIf
EndProcedure 

; -- 

Procedure.s ReadTextFromFile(Filename.s)  
  Protected result.s 

  If ReadFile(#FILE_In, Filename) 
		result = ReadString(#FILE_In)

		CloseFile(#FILE_In) 
  EndIf 
  ProcedureReturn result 
EndProcedure 


; --- UI Main Window ----

Procedure CreateMainWindow(WndW=340, WndH=200) 

  If OpenWindow(#WND_Main, 0, 0, WndW, WndH, #ProgramMainCaption, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered) 

    ButtonGadget(#GDT_btnWriteFile,   50, 50, 100, 30, "Write File")  
    ButtonGadget(#GDT_btnDeleteFile, 190, 50, 100, 30, "Delete File") 

		StringGadget(#GDT_strFileContent, 120, 125, 100, 30, "<File Content>") 
  
    ProcedureReturn #True 
  EndIf
  ProcedureReturn #False 
EndProcedure 

; --- 

Procedure Main() 
  Protected event, bStore, text.s   ; variables should be used as locally as possible 

  If CreateMainWindow() 

    ; do some specific initialization 
    bStore = #True 

    Repeat
    	event = WaitWindowEvent()  
    	Select event
        Case #PB_Event_CloseWindow 
          Break ; bye 

    		Case #PB_Event_Gadget
    			Select EventGadget()  
    				Case #GDT_btnWriteFile 
              text = "Wert" 
              WriteTextTofile(#Filename, text)	

    				Case #GDT_btnDeleteFile 
    					DeleteFile(#Filename) 
					
  			  EndSelect ; EventGadget() 
      EndSelect ; event 
	
    	If bStore  
    		bStore = #False 
        text = ReadTextFromFile(#Filename) 
    		SetGadgetText(#GDT_strFileContent, text)
    	EndIf
	
    ForEver ; Until event = #PB_Event_CloseWindow
  EndIf 

  ProcedureReturn 0   ; not needed, but looks better (IMHO) 
EndProcedure 

; --- main --- 

End Main() 

; --- BoF 
So, jetzt gehe ich wieder unter meinen Stein.
Viel Spaß.
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
HeX0R
Beiträge: 3042
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: Auffälligkeit mit Speicherverhalten

Beitrag von HeX0R »

Nic hat eigentlich so ziemlich alle Punkte, die ich im Kopf hatte angesprochen.
Ausser einem Punkt:

Code: Alles auswählen

					test$ = "Wert"
					If CreateFile(0,"C:\test$")
						WriteString(0,test$)
						CloseFile(0)
						auf = 1
					EndIf
Es wird zwar geprüft, ob die Datei erstellt werden konnte, aber wo wird der Benutzer denn benachrichtigt, wenn es nicht geklappt hat?
Davon abgesehen ist es auch ziemlich hirnrissig eine Datei namens test$ zu erstellen.
Antworten