Seite 1 von 1

runprogram(ping) / string sehr eigenartig ...

Verfasst: 22.02.2014 12:30
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?

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

Verfasst: 22.02.2014 12:35
von RSBasic
Versuch mal, nicht im Unicode, sondern im ASCII zu kompilieren.
Oder: http://www.purebasic.fr/german/viewtopi ... 01#p315901

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

Verfasst: 22.02.2014 12:38
von Pr0fessor
:bounce:

so simple....

ja - funkt! - Danke!!! :praise:

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

Verfasst: 22.02.2014 12:43
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) 

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

Verfasst: 22.02.2014 13:34
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

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

Verfasst: 22.02.2014 13:53
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

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

Verfasst: 22.02.2014 14:17
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:

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

Verfasst: 22.02.2014 14:22
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.

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

Verfasst: 22.02.2014 14:27
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.