0

はじめに: 私は現在、ゲーム「Sniper Elite V2」の専用サーバーで作業している管理者です。SEV2 の専用サーバーは、コンソール アプリケーションのウィンドウの下で実行されます。wineHQ を使用して、このアプリケーションを Linux でも実行できます。コンソールが新しいウィンドウで起動されることを除いて、すべてが良好であるため、コンソールの入力/出力を取得する方法はありません (リンク: http://img802.imageshack.us/img802/650/sev22.png )。さらに、「このプログラムは DOS モードでは実行できません」と (HEX エディターで) 読み取ることができます。私の目的は、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);

" " というツールを使用していますが、このツール自体ではSniper Elite V2 Dedicated ServerWinSpy++にデータを取得/入力することはできません。

アイデア/例/反省は大歓迎です:-)

4

1 に答える 1

1

「このプログラムは DOS モードでは実行できません」

あなたは間違いを犯します。「DOS モード」と「コンソール」という用語を混同しないでください。Windows コンソールは DOS モードではありません。コンソールは、コンソール サブシステム用に作成された任意の Windows アプリケーション 32/64 ビットを実行できるネイティブ ターミナルです。「DOS モード」とは、DOS、TR-DOS、FreeDOS などの Windows オペレーティング システム以前のことです。

質問に関しては、1 つのコンソール アプリが 2 つのコンソールで同時に動作することはできません。

更新

サーバーは GUI サブシステム用に構築されており、AllocConsole でコンソールを作成しているようです。

  1. 「CreateProcess」でサーバーを実行する
  2. 新しいコンソール ウィンドウが表示されるまで少し待ちます。
  3. 「FreeConsole」と「AttachConsole(ServerPID)」を呼び出します

したがって、console_2 に属するプロセスから console_1 を読み取りたい場合は、

  1. たとえば、3番目のプロセスを開始しますDETACHED_PROCESS
  2. 電話FreeConsole(必須) とAttachConsole(RootPidFromConsole_1)
  3. 3 番目のプロセスと console_2 のプロセス (パイプ、共有メモリなど) の間で通信する

これはWindowsで機能します。

于 2012-07-31T21:27:43.157 に答える