2012-07-31 77 views
0

简介: 我是一名管理员,目前正在致力于“Sniper Elite V2”游戏的专用服务器。 SEV2的专用服务器在控制台应用程序的窗口下运行。 wineHQ也可以在Linux下运行此应用程序。一切都很好,除了控制台是在新窗口中启动的,所以没有办法控制台输入/输出(链接:http://img802.imageshack.us/img802/650/sev22.png)。此外,我们可以阅读(使用HEX编辑器)“该程序不能在DOS模式下运行”。我的目标是恢复DOS兼容性。C++从远程控制台应用程序中检索内容

我的想法是创建另一个编写在C++(带有CodeBlocks)的控制台应用程序。 这种“挂钩”应检索专用服务器的“窗口”的内容(文本),并显示它,与课程的可能性将命令输入到专用服务器控制台。就像那样,我们将能够在Windows和Linux上处理输入/输出。 我花时间画了一点架构:http://img195.imageshack.us/img195/3017/29585679.png

我的问题是:如何做到这一点?我应该使用哪些功能?

在这一点上,我卡住了。我试过以下方法:

FUNC“AttachConsole”失败。

以下伪代码已经失败过:

mainWindow = FindWindow(TEXT("ConsoleWindowClass"), NULL)); 

console = FindWindowEx(mainWindow, NULL, TEXT("ConsoleWindowClass"), NULL); 

SendMessage(
    console, 
    WM_GETTEXT, 
    sizeof(buffer)/sizeof(TCHAR), 
    (LPARAM)buffer); 

我使用了一个名为“WinSpy++”帮我的工具,但工具无法本身检索/输入数据到狙击精英V2专用服务器

任何想法/例子/反射欢迎:-)

+0

'AttachConsole'是正确的方法。为什么它“失败”? – Maximus 2012-07-31 20:38:23

+0

但是,不明白这个想法。您是否想同时从**两个控制台读取/写入?并不确定创建的流程树。你说葡萄酒。什么在Win中有效,可能在WineHQ中不起作用 – Maximus 2012-07-31 20:43:18

+0

“AttachConsole”函数返回零。 'GetLastError'什么都不返回。 – user1566601 2012-07-31 21:13:36

回答

1

“这个程序不能在DOS模式下运行” 你犯了一个错误。不要混用术语“DOS模式”和“控制台”。 Windows控制台不是DOS模式。控制台是本机终端,您可以在其中运行为控制台子系统编写的任何Windows应用程序32/64位。 “DOS模式”在Windows操作系统之前,例如DOS,TR-DOS,FreeDOS等。

至于问题,一个控制台应用程序不能同时与两个控制台工作。

UPD

看来,服务器已建造了GUI子系统,并与AllocConsole创建控制台。而出现新的控制台窗口

  1. 与“CreateProcess的”
  2. 运行服务器再等一会儿。
  3. 呼叫 'FreeConsole' 和 'AttachConsole(ServerPID)'

所以,如果你想读的过程console_1属于console_2,你必须

  1. 启动第三个过程,例如使用DETACHED_PROCESS
  2. 请致电FreeConsole(必填)和AttachConsole(RootPidFromConsole_1)
  3. 第三种方法和console_2的进程间通信(管道,共享内存,...)

这部作品在窗口。

+0

谢谢你的回答,明天我会试试。回顾一下,在我的钩子中:1)创建进程(de专用服务器控制台作为子进程,具有DETACHED_PROCESS属性),2)通过AttachConsole(pidofmychildprocess)调用freeconsole,3)通信的东西。可以吗? – user1566601 2012-07-31 22:33:20

+0

嗯?我认为你想从“专用服务器”读取,不是吗?如果你可以在控制台中启动进程,你想读取(在该控制台中从pprocess调用CreateProcess) - 省略'DETACHED_PROCESS'标志和步骤2. – Maximus 2012-08-01 06:12:57

+0

是的,它有点复杂...在我的程序中(* console_primary * ),当我使用'CreateProcess'启动专用的服务器控制台时,这个控制台是在一个单独的控制台(* console_child *)中启动的。我希望* console_primary *读取* console_child * console的数据并在其控制台(* console_primary *)中输出检索到的数据。我还希望当我在* console_primary *中编写命令时,这个命令将启动到* console_child *。实际上,我想要* console_child *的输出的重定向以及从* console_primary *输入到* console_child *的能力。 – user1566601 2012-08-01 08:41:23