RunProgram vs. Consolenserver

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

RunProgram vs. Consolenserver

Beitrag 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()
Zuletzt geändert von HeX0R am 03.11.2021 18:45, insgesamt 1-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: RunProgram vs. Consolenserver

Beitrag 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.
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: RunProgram vs. Consolenserver

Beitrag 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?
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: RunProgram vs. Consolenserver

Beitrag von HeX0R »

Ich werde das mal im englischen Forum fragen, irgendwie gefällt mir meine Krücke nicht.
Antworten