Bei empfangenem String Computer Herunterfahren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Bei empfangenem String Computer Herunterfahren

Beitrag von Joel »

Hi,
Ich habe mal wieder ein Programm geschrieben und habe mal wieder eine Frage bzw. ein Problem.

ich möchte dass wenn ich einen String sende dass dann der computer herunterfährt.Dass hab ich versucht in einen Code umzusetzen aber irgentwass habe ich bei folgendem Code Falsch gemacht.

Ich weiß die Profis lachen sich kapputt wenn die diesen Code shehen aber ich bin halt noch ein Anfänger.

Code: Alles auswählen

Code:
Buffer.s=Space(256)
nSize.l=256
InitNetwork()
RET=GetUserName_(@Buffer,@nSize)
CreateNetworkServer(6505)
MakeIPAddress(192, 192, 192, 192) 
If IsFilename("C:\Programme\Run.exe") = 0
MessageRequester("Error", "Die Datei befinet sich nicht in dem Ordner C:\Programme", 0)
End 
EndIf
;a= NetworkServerEvent() = 2

If CopyFile("Run.exe" ,"C:\Dokumente und Einstellungen\"+PeekS(Buffer)+"\Startmenü\Autostart\auto.exe") = 0
 Repeat
 If  NetworkServerEvent() = 2
 If RunProgram("c:/windows/system32/shutdown.exe","-s -t 0","C:\") = 0
Until RunProgram("c:/windows/system32/shutdown.exe","-s -t 0","C:\")
Else 
MessageRequester("Error", "Can't load the movie...", 0)
EndIf 
EndIf 
EndIf 
 EndIf 

End
codetags inkludiert --bobobo
Zuletzt geändert von Joel am 29.10.2006 21:53, insgesamt 1-mal geändert.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Schuldigung, meinte eigentlich Bei empfangenem String Computer Herunterfahren.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

1. Bitte CODE-Tags setzen und nutzen!
2. Warum schreibst du das hier:

Code: Alles auswählen

Buffer.s=Space(256) 
nSize.l=256 

RET=GetUserName_(@Buffer,@nSize) 

MakeIPAddress(192, 192, 192, 192)  
Das brauchst du doch gar nicht!
Hier mein Code für dich!

Code: Alles auswählen

InitNetwork()

CreateNetworkServer(6505)

Repeat
	
	event_n=NetworkServerEvent()
	If event_n
		client=NetworkClientEvent()
		
		Select event_n
			Case 2
				*buffer=AllocateMemory(63998)
				Repeat : Until ReceiveNetworkData(client, *buffer, 1000) <> 1000
				Debug PeekS(*buffer)
				FreeMemory(*buffer)
				If RunProgram("c:/windows/system32/shutdown.exe","-s -t 0","") = 0
					MessageRequester("Fehler", "shutdown.exe konnte nicht gestartet werden.")
				EndIf
		
		EndSelect
		
	EndIf
	
	Delay(1)
	
Until Quit

End
Server wird an Port 6505 gestartet; wenn ein Netzwerkereignis auftritt (event_n), dann prüft das Select/Case welches Ereignis auftriit. Ich empfehel in der Repeat-Schleife imemr Select/Case zu nehmen, weil es einfacherer, übersichtlicher ist und weil man es besser etwas hinzufügen oder entfernen kann, ohne wie bei If/Else so viel ändern zu müssen.
Die Fehlermeldung

Code: Alles auswählen

MessageRequester("Error", "Can't load the movie...", 0) 
erscheint mir auch ein bisschen merkwürdig, welches MOVIE mneinst du? Hast du einfach erst einmal das Beispiel aus der Hilfe geommen? Ist ja auch ok, aber wenn du es anpasst, dann gleich richtig (nicht bös gemeint).
Abfragen bei InitNetwork() und CreateNetworkServer() lasse ich generell weg, da diese Funktionen meist eh positiv verlaufen; bei Beispielen im Forum lasse ich sowas erst recht weg, wegen der Übersichtlichkeit. Du kannst ja noch eine If/Else Abfrage einbauen.

Das mit der Shutdown.exe habe ich einfach mal so übernommen, ich hörte, wenn man bei XP den PC ausscahlten will, dann braucht man Privilegien? Da mach dich nochmal schlau.

Viel Spaß mit dem Code, AND51
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

AND51 hat geschrieben:

Code: Alles auswählen

[...]
				*buffer=AllocateMemory(63998)
[...]
Wozu allocierst du da so viel Memory, wenn du ihn eh nicht benutzt? Die Schleife danach schreibt ja immer direkt an den Anfang des Speicherbereichs..
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Dass erste mit dem Username Brauchte ich füt diesen Befehl

Code:
If CopyFile("Run.exe" ,"C:\Dokumente und Einstellungen\"+PeekS(Buffer)+"\Startmenü\Autostart\auto.exe") = 0

und dass mit dem movie ja die meldung einfach kopiert von Movie.pb. Ich hatte keinen bock dass zu schreiben. Kopieren ging schneller. :lol:


ok vielen dank, für eure Hilfe
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich war mir nicht sicher. Das mach ich meistens so, und weil Joel hier ja noch Anfänger ist, wird er ja warscheinlich eher SendNetworkString() benutzen. ich wollte auf der sicheren Seite sein, dass er BELIEBIGE Strings senden kann; Warum dann nicht 64 k sondern 63998? Nun, am Ende des SPeichers schreibt der Computer oder PB doch automatisch imemr ein Chr(0), und ich weiß nicht, ob es ein oder zwei Sonderzeichen sind, dafür wollte ich noch Platz lassen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Beitrag von Marvin »

Das mit dem RunProgram(shutdown.exe) könnt man mit ExitWindowsEx_() ersetzen.
IsFilename() überprüft (meiner Meinung nach) nicht, ob die Datei existiert, sondern nur, ob der Dateiname gültig ist. Außerdem, darf man nicht den Pfad mit angeben, nur den Dateinamen!
Die Hilfe hat geschrieben:Überprüft, ob der angegebene 'Dateiname$' für das Dateisystem korrekt ist. Zum Beispiel sind unter Windows die '/' und '\' Zeichen nicht in einem Dateinamen erlaubt. Ist der 'Dateiname$' korrekt, wird 1 zurückgegeben, andernfalls 0. Der 'Dateiname$' muss nicht den Pfad mit enthalten.
Das MakeIPAddress gibt nur einen Wert zurück, hier steht es sinnlos in der Landschaft rum, kann also auch weg.
Der letzte Teil muss außerdem völlig anders aussehen:

Code: Alles auswählen

Repeat
If NetworkServerEvent() = 2
If RunProgram("c:/windows/system32/shutdown.exe","-s -t 0","C:")
End
Else
MessageRequester("Error", "Can't load the movie...", 0)
EndIf
EndIf
ForEver
//EDIT: @AND51: stimmt, ups, korrigiert... <)
Zuletzt geändert von Marvin am 04.05.2006 16:51, insgesamt 1-mal geändert.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Warum soll das PB programm warten, bis das Programm beendet ist? Meinst du, ich schreibe auch ein Proggi, das wartet bis WIndows sich heruntergefahren hat und macht sich dann erst selbst aus? :lol: :o

Wenn du prüfen wilst, ob eine Datei vorhanden ist, benutze FileSize(), siehe hilfe.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

AND51 hat geschrieben:ich wollte auf der sicheren Seite sein, dass er BELIEBIGE Strings senden kann; Warum dann nicht 64 k sondern 63998? Nun, am Ende des SPeichers schreibt der Computer oder PB doch automatisch imemr ein Chr(0), und ich weiß nicht, ob es ein oder zwei Sonderzeichen sind, dafür wollte ich noch Platz lassen.
:freak:

Hab ich das jetzt richtig verstanden? Du kürzt extra den Speicher damit PB über den Speicher hinaus schreiben kann? (Was eh nich passiert, aber deiner Auffassung nach soll das ja so sein)
Frei nach dem Motto "No risk, no fun!"? ^^
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Oh, ja stimmt. Du hast Recht! Ich hätte 64002 Byte Speicher allokieren sollen! Da habe ich dann wohl einen knick in einer entlegenen Gehirnwinde gehabt... :lol: 8)

Mannomann, dann habe ich ja seit ich PB kenne mit dieser falschen Information gelebt... Argh! >_< :angry:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten