runprogram(ping) / string sehr eigenartig ...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

runprogram(ping) / string sehr eigenartig ...

Beitrag von Pr0fessor »

juhu....

habe mal folgenden code gestartet:

Code: Alles auswählen

Ping = RunProgram("Ping", "www.purebasic.com", "", #PB_Program_Open | #PB_Program_Read)

If Ping
   While ProgramRunning(Ping)
      Output.s + ReadProgramString(Ping) + Chr(13)
   Wend
EndIf

MessageRequester("Output", Output)
dabei scheint das ping- Fensterchen leer zu sein und Messagerequester gibt nur chinesische Zeichen aus. egal ob Purebasic.com oder google.de oder sonstwas ...

ich kann damit also nichts anfangen bzw. auswerten .....

; Win8.1 x64 | PB 5.21 LTS x86 & x64

hab ich nen fehler gemacht oder.... was kann das sein?
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: runprogram(ping) / string sehr eigenartig ...

Beitrag von RSBasic »

Versuch mal, nicht im Unicode, sondern im ASCII zu kompilieren.
Oder: http://www.purebasic.fr/german/viewtopi ... 01#p315901
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Pr0fessor
Beiträge: 40
Registriert: 21.07.2011 16:13
Computerausstattung: Intel Qore2Quad Q6600, 4GB RAM, Radeon HD 5770, Windows 8.1 Pro 64bit
Wohnort: Hagenow
Kontaktdaten:

Re: runprogram(ping) / string sehr eigenartig ...

Beitrag von Pr0fessor »

:bounce:

so simple....

ja - funkt! - Danke!!! :praise:
~ PureBasic 5.21 LTS x86 | PureBasic 5.21 LTS x64 | Windows 8.1 Pro with Media Center x64 ~
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: runprogram(ping) / string sehr eigenartig ...

Beitrag von ts-soft »

Code: Alles auswählen

CompilerIf #PB_Compiler_Unicode
  CompilerError "Bitte ASCII-Modus aktivieren!"
CompilerEndIf

EnableExplicit

Define Ping, Output.s

Ping = RunProgram("Ping", "www.purebasic.com", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

If Ping
   While ProgramRunning(Ping)
      Output.s + ReadProgramString(Ping) + Chr(10)
   Wend
   CloseProgram(Ping)
EndIf

OemToChar_(Output, Output)
MessageRequester("Output", Output)
Und Crossplattform:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  CompilerIf #PB_Compiler_Unicode
    CompilerError "Bitte ASCII-Modus aktivieren!"
  CompilerEndIf
  Define para.s = "www.purebasic.com"
CompilerElse
  Define para.s = "-c 4 www.purebasic.com"
CompilerEndIf

EnableExplicit

Define Ping, Output.s

Ping = RunProgram("ping", para, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

If Ping
   While ProgramRunning(Ping)
      Output.s + ReadProgramString(Ping) + Chr(10)
   Wend
   CloseProgram(Ping)
EndIf

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  OemToChar_(Output, Output)
CompilerEndIf
MessageRequester("Output", Output) 
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: runprogram(ping) / string sehr eigenartig ...

Beitrag von NicTheQuick »

Man kann sich auch sein eigenes 'ReadProgramString()' schreiben, was intern einfach 'ReadProgramData()' nutzt.

Hier mal eine vereinfachte threadtaugliche Version, die nicht auf Zeilenenden reagiert, sondern einfach als String raushaut, was da ist.

Code: Alles auswählen

EnableExplicit

#READ_PROGRAM_STRING_EX_BUFFER_SIZE = 2048
Threaded *READ_PROGRAM_STRING_EX_BUFFER
*READ_PROGRAM_STRING_EX_BUFFER = AllocateMemory(#READ_PROGRAM_STRING_EX_BUFFER_SIZE + 2)
Procedure.s ReadProgramStringEx(Program.i, Format.i)
	CompilerIf #PB_Compiler_Unicode
		If Format = #PB_Unicode
			ProcedureReturn ReadProgramString(Program)
		EndIf
	CompilerElse
		If Format = #PB_Ascii
			ProcedureReturn ReadProgramString(Program)
		EndIf
	CompilerEndIf
	
	Protected size.i, result.s
	Repeat
		size = ReadProgramData(Program, *READ_PROGRAM_STRING_EX_BUFFER, #READ_PROGRAM_STRING_EX_BUFFER_SIZE)
		result + PeekS(*READ_PROGRAM_STRING_EX_BUFFER, size, Format)
	Until size < #READ_PROGRAM_STRING_EX_BUFFER_SIZE
	
	ProcedureReturn result
EndProcedure


Define Ping, Output.s

Ping = RunProgram("ping", "-c 4 www.purebasic.com", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)

If Ping
   While ProgramRunning(Ping)
      Output.s + ReadProgramStringEx(Ping, #PB_Ascii) + Chr(10)
   Wend
   CloseProgram(Ping)
EndIf

MessageRequester("Output", Output) 
Ehrlich gesagt, sind noch Bugs drin, aber ich glaube nicht, dass die auftreten werden. Falls doch, bitte melden. :D
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: runprogram(ping) / string sehr eigenartig ...

Beitrag von ts-soft »

Irgendwie komme ich mit Deiner Funktion nicht klar. Nach ProcedureReturn wird sie verlassen, der Code dahinter ignoriert.

Unter Linux ist Unicode oder ASCII egal, das funktioniert immer!
Unter Windows kommt kein ASCII, es kommt OEM! Der kann weder nach PeekS noch
davor im Unicode-Modus gewandelt werden, OemToChar_() unterstützt das nicht, und da in der Ausgabe
von Ping auch Umlaute enthalten sind, macht das ganze nicht so viel Sinn :wink:
PS: den parameter -c gibt es unter Windows nicht, bzw. ist ein anderer Buchstabe (wird auch gar nicht benötigt).

Deine Funktion bewirkt IMHO eigentlich garnichts :mrgreen:

Gruß
Thomas

//edit
jetzt wird es mir klar, wenn 2 versch. kompilierte Ausgaben gelesen werden sollen, dann die Umwandlung.
Macht jetzt aber mit ping wirklich keinen Sinn, das funktioniert unter Linux in beiden CompilerModes und
unter Windows kann es wegen OEM nur im ASCII Mode funktionieren.

Es hat mich also das Beispiel irritiert, ansonsten ist es schon nützlich :D
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: runprogram(ping) / string sehr eigenartig ...

Beitrag von NicTheQuick »

Achja, das gute alte Windows. Immer für einen Umweg zu haben. Dann geht es wohl doch nicht ohne diese komische API.

Und wegen den Ping-Parametern. Ohne "-c 4" läuft ping ewig. Deswegen musste ich das halt ändern. :wink:
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: runprogram(ping) / string sehr eigenartig ...

Beitrag von ts-soft »

Und mit -c 4 gibt Windows die Hilfe zu ping aus :mrgreen:
Um die ganzen Compilerdirektiven in meinem Crossplattform Beispiel kommt man bei ping
wohl nicht rum.
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: runprogram(ping) / string sehr eigenartig ...

Beitrag von NicTheQuick »

Ja, ich hatte mir vorher auch einfach nicht deine Crossplatform-Lösung angeschaut. Ich wollte etwas machen, damit man nicht gezwungen ist den Code im Ascii-Mode zu kompilieren.
Antworten