Seite 1 von 1

RunProgram vs. Consolenserver

Verfasst: 01.11.2021 14:21
von HeX0R
Irgendwie raff ich's nicht, ich versuche die Konsolenausgabe eines dedizierten Servers abzugreifen (in diesem Fall von Serious Sam 2).
Aber egal, was ich versuche, ich bekomme die Ausgabe immer erst, wenn ich den Server beende (CTRL-C in das Serverkonsolenfenster).

Das schräge ist:
Starte ich den Server einmal vorher über Windows Explorer und starte dann mit diesem Code eine zweite Instanz, bekomme ich die Ausgabe direkt?!
Allerdings läuft er dann nicht, weil die Ports natürlich belegt sind.

Die #RUNMODE Konstante war für verschiedene Varianten, mit CMD z.B., aber alles endet im selben Ergebnis.

Irgendwelche Ideen?

Code: Alles auswählen

#Main_Path_To_Game  = "{STEAMFOLDER}steamapps\common\Serious Sam 2\"
#Dedicated_Server   = "Bin\DedicatedServer.exe"
#RUNMODE            = 1   ;1 => set current dir and direct call


Procedure.s GetSteamFolder()
	Protected Result.s, hKey, lpcbData, *lpData, lpType, Key.s


	If RegOpenKeyEx_(#HKEY_CURRENT_USER, "SOFTWARE\Classes\steam\Shell\Open\Command", 0, #KEY_READ, @hKey) = #ERROR_SUCCESS
		If RegQueryValueEx_(hKey, @Key, #Null, #Null, #Null, @lpcbData) = #ERROR_SUCCESS
			*lpData = AllocateMemory(lpcbData)
			If *lpData
				If RegQueryValueEx_(hKey, @Key, 0, @lpType, *lpData, @lpcbData) = #ERROR_SUCCESS
					Result = PeekS(*lpData)
				EndIf
				FreeMemory(*lpData)
			EndIf
		EndIf
		RegCloseKey_(hKey)
	EndIf

	ProcedureReturn GetPathPart(Result)
EndProcedure

Procedure main()
	Protected a$, PID, R, *Buffer, SteamPath$
	
	SteamPath$ = GetSteamFolder()
	*Buffer = AllocateMemory($10000)
	CompilerSelect #RUNMODE
		CompilerCase 1
			SetCurrentDirectory(ReplaceString(#Main_Path_To_Game, "{STEAMFOLDER}", SteamPath$))
			PID = RunProgram(ReplaceString(#Main_Path_To_Game, "{STEAMFOLDER}", SteamPath$) + #Dedicated_Server, "", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Error)
		CompilerCase 2
			PID = RunProgram(ReplaceString(#Main_Path_To_Game, "{STEAMFOLDER}", SteamPath$) + #Dedicated_Server, "", ReplaceString(#Main_Path_To_Game, "{STEAMFOLDER}", SteamPath$), #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Error)
		CompilerCase 3
			SetCurrentDirectory(ReplaceString(#Main_Path_To_Game, "{STEAMFOLDER}", SteamPath$))
			PID = RunProgram(GetEnvironmentVariable("COMSPEC"), "/c " + #DQUOTE$ + #Dedicated_Server + #DQUOTE$, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Error)
		CompilerCase 4
			PID = RunProgram(GetEnvironmentVariable("COMSPEC"), "/c " + #DQUOTE$ + ReplaceString(#Main_Path_To_Game, "{STEAMFOLDER}", SteamPath$) + #Dedicated_Server + #DQUOTE$, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write | #PB_Program_Error)
	CompilerEndSelect
	If PID
		While ProgramRunning(PID)
			R = AvailableProgramOutput(PID)
			If R
				R = ReadProgramData(PID, *Buffer, R)
				Debug PeekS(*Buffer, R, #PB_Ascii)
			EndIf
			
			a$ = ReadProgramError(PID)
			If a$
				Debug "== Error == : " + #CRLF$ + a$
			EndIf
			Delay(10)
		Wend
		CloseProgram(PID)
	EndIf
	FreeMemory(*Buffer)
EndProcedure

main()

Re: RunProgram vs. Consolenserver

Verfasst: 01.11.2021 16:46
von HeX0R
Ich hab mir jetzt erst mal damit beholfen, die log Datei des Servers live zu verarbeiten, das geht zwar auch, ist aber irgendwie von hinten durch die Brust ins Auge.
Wenn mir einer aufs Pferd helfen kann, um so besser, wenn nicht auch nicht schlimm, dann arbeite ich eben mit der Krücke.

Re: RunProgram vs. Consolenserver

Verfasst: 02.11.2021 12:18
von dige
Mmmh, klingt so, als ob nie ein AvailableProgramOutput(PID) gemeldet wird? Vielleicht gibt es noch einen bestimmten Parameter um die Ausgabe des Logservers zu steuern?

Re: RunProgram vs. Consolenserver

Verfasst: 03.11.2021 18:34
von HeX0R
Ich werde das mal im englischen Forum fragen, irgendwie gefällt mir meine Krücke nicht.