读取控制台缓冲区/输出C ++

伊武里都

我的问题很简单,但是对于我来说,找到解决方案似乎是绝对不可能的。

我有一个专用的游戏服务器(JEDI ACADEMY JAMPDED),它是一个控制台应用程序。它连续写一些信息,我想以某种方式处理数据。如果我可以用外部读取它的输出,那将很容易。

问题:它不会写入标准输出,因此无法通过管道传输批处理文件,并且popen也无法正常工作。

所以我想使用WINAPI。我能够创建该过程,但仍然无法读取输出。

我尝试了这些:

这是jampded.exe: 安慰

我从我的朋友那里得到了一个基本的代码,后者从Ingame读取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)是对的。它不会写入stdout,但是我可以使用汇编程序对其进行修复。所以他在这方面是不对的。

在此之后,输出将不同步,但可以通过将跳转交换为nops来成功修复。更多: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

工作正常,您可以轻松地为服务器创建自己的mod。或您想要的任何东西。:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

读取控制台缓冲区/输出C ++

来自分类Dev

如何在VBNET中读取控制台缓冲区?

来自分类Dev

清除键盘缓冲区或阻止输入(C#控制台)

来自分类Dev

重定向输出时,为什么调整控制台缓冲区会引发无效的句柄异常?

来自分类Dev

清除主机后如何获取控制台缓冲区历史记录?

来自分类Dev

在将视频渲染到帧缓冲区时隐藏虚拟控制台的最佳实践

来自分类Dev

如何将Windows 10控制台屏幕缓冲区更改为超过9999?

来自分类Dev

读取控制台输出以在C中执行ping操作

来自分类Dev

从 C++ 中的控制台输出读取

来自分类Dev

读取分离过程的控制台输出

来自分类Dev

如何控制Netty用于读取的缓冲区?

来自分类Dev

C#:控制台输出无限(∞)

来自分类Dev

NodeJS缓冲区-读取小端缓冲区

来自分类Dev

C ++读取缓冲区中的整个文件

来自分类Dev

在C中如何读取超出缓冲区末尾的内容?

来自分类Dev

读取C中缓冲区的特定部分

来自分类Dev

C recv()未在缓冲区中读取

来自分类Dev

C读取文件和打印缓冲区

来自分类Dev

读取c中的输入后如何清除缓冲区?

来自分类Dev

捕获c ++ system()命令的缓冲区输出

来自分类Dev

使用InputStream执行JAR并读取控制台输出-Java

来自分类Dev

Java读取文件并将其输出到控制台

来自分类Dev

通过SSH,Linux读取进程的控制台输出

来自分类Dev

C ++文件输入/输出控制台输出

来自分类Dev

C ++刷新缓冲区

来自分类Dev

C缓冲区指针

来自分类Dev

缓冲区溢出 C

来自分类Dev

从控制台读取多行

来自分类Dev

从控制台读取双倍