0

简介: 我是一名管理员,目前在《狙击精英V2》游戏的专用服务器上工作。SEV2 的专用服务器在控制台应用程序的 Windows 下运行。我们也可以使用 wineHQ 在 Linux 下运行这个应用程序。一切都很好,除了控制台在新窗口中启动,所以没有控制台输入/输出(链接:http: //img802.imageshack.us/img802/650/sev22.png)。此外,我们可以读取(使用 HEX 编辑器)“该程序不能在 DOS 模式下运行”。我的目标是恢复 DOS 兼容性。

我的想法是创建另一个用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++”的工具来帮助我,但该工具本身无法检索/输入数据到Sniper Elite V2 专用服务器

欢迎任何想法/示例/反思:-)

4

1 回答 1

1

“此程序无法在 DOS 模式下运行”

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

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

更新

似乎服务器是为 GUI 子系统构建的,并使用 AllocConsole 创建控制台。

  1. 使用“CreateProcess”运行服务器
  2. 稍等片刻,新的控制台窗口出现。
  3. 调用“FreeConsole”和“AttachConsole(ServerPID)”

老的

所以,如果你想从属于console_2的进程中读取console_1,你必须

  1. 开始第三个过程,例如DETACHED_PROCESS
  2. 致电FreeConsole(必填)和AttachConsole(RootPidFromConsole_1)
  3. 在第三个进程和 console_2 的进程之间进行通信(管道、共享内存……)

这适用于 Windows。

于 2012-07-31T21:27:43.157 回答