我的问题很简单,但解决scheme似乎绝对不可能find。
我有一个专门的游戏服务器(JEDI ACADEMY JAMPDED),这是一个控制台应用程序。 它连续写入一些信息,我想以某种方式处理数据。 如果我可以用外部的方式读取它的输出,这将是容易的。
问题:它不写入标准输出,所以不能用batch filepipe道,popen也不起作用。
所以我想用WINAPI做。 我能够创build进程,但仍然无法读取输出。
我试过这些:
如何在c ++中调用:: CreateProcess来启动Windows可执行文件?
CreateProcess和CreatePipe执行一个进程,并以VC ++中的stringforms返回输出
和MSDN官方的例子一样,但还是一无所获。
这是jampded.exe:
我从我的朋友那里得到了一个可视化的基本代码,他从游戏中读取ConsoleInput,所以我敢肯定,可以读取控制台:
片段:
Global hWnd = FindWindow_(#Null,"Jedi Knight Academy MP Console") ;console window Global hWnd2 = FindWindow_(#Null,"Jedi Knight®: Jedi Academy (MP)") ;actual game window Global inputhWnd = FindWindowEx_(hwnd,0,"edit",0) ;the one to send stuff to Global consolehWnd = FindWindowEx_(hwnd,inputhWnd,"edit",0) ;the one to read the console from Procedure checkConsole() Protected wholetext.s, oldtext.s,text.s, checkname.s Repeat wholetext = getText() If wholetext text = StringField(wholetext,CountString(wholetext,#CRLF$),#CRLF$) If oldtext <> text oldtext = text analyseConsole(@text) EndIf EndIf Delay(20) writePreferences() Until quit EndProcedure Procedure.s getText() Protected wholetext.s If hWnd And hWnd2 If Not inputhWnd Or Not consolehWnd inputhWnd = FindWindowEx_(hWnd,0,"edit",0) consolehWnd = FindWindowEx_(hWnd,inputhWnd,"edit",0) EndIf length = SendMessage_(consolehWnd, #WM_GETTEXTLENGTH, 0, 0) wholetext = Space(length) SendMessage_(consolehWnd,#WM_GETTEXT,length + SizeOf(Character),@wholetext) ProcedureReturn wholetext Else If FindWindow_(#Null,"Jedi Knight Academy MP Console") hWnd = FindWindow_(#Null,"Jedi Knight Academy MP Console") hWnd2 = FindWindow_(#Null,"Jedi Knight®: Jedi Academy (MP)") inputhWnd = FindWindowEx_(hwnd,0,"edit",0) consolehWnd = FindWindowEx_(hwnd,inputhWnd,"edit",0) EndIf ProcedureReturn "" EndIf If @wholetext > 0 FreeMemory(@wholetext) EndIf EndProcedure
也许这可以帮助我和其他人:)
Hans Passant是对的。 它不写入标准输出,但我可以用程序集来修复它。 所以他不对。
在此之后,输出是不确定的,但是可以通过交换跳转来成功修复。 更多: stackoverflow.com/questions/23811572/writefile-function-with-assembly-debugging-syncing
所以,总结一切:
它不仅仅适用于Jedi Academy专用服务器,它可以用于存储输出的任何二进制文件,但不适用于STDOUT。
更改WriteFile函数写入STDOUT(-11是stdout):
解决同步问题:
这是JampDed 1.00,所以如果你想使用它的另一个版本的JK,或者另一个游戏,你必须自己找到这些地址。 最好的做法(在我看来),如果你打电话更深入的代码。 你可以从你发现的任何信息开始,然后再深入。
我以这种方式记录了整个调试过程:
004429a7 is (call 0043d440) - 0043d44e (call 00422720) -- 004227dD (call edx) - 2008F1B0 --- 2008f103 (call 2008cad0) ---- 2008c4d0 ----- 2008c569 (call 2008b030) ------ 200a25f7 DWORD PTR DS:[20106A28] - 00422540 ------- 0042254b (CALL DWORD PTR DS:[ECX+4]) - 0043d590 -------- 0043d8aa (call 0040fb40) --------- 0040FC39 (call 0044b7a0) ---------- 0044b66c (call 004964dd) ----------- 00496500 (call 0049a4ba) ------------ 0049a4cd (call 00497d66) ------------- 00497d92 (call 0049e18c) -------------- 0049e26f (CALL DWORD PTR DS:[4A715C])
如果你注意到最后一个是WriteFile的位置。 而在此之前2是logsync的东西所在
所以现在
jampDed.exe | stdout.exe
工作,你可以开始创建自己的服务器模块容易。 或者任何你想要的。 🙂