2

問題のあるサードパーティの DLL をラップする小さなコンソール アプリケーションを作成しました。_popenを使用して GUI アプリケーションから呼び出しており、コンソール プログラムの標準出力から値を読み取りたいだけです。その際、望ましくないコンソール ウィンドウが短時間表示されます。

これは、CreateProcess で特定の STARTUPINFO 構成を使用することで回避できることを認識しています。ただし、コンソール アプリケーションに修正を加えて、引き続き _popen を使用したいと考えています。Windows サブシステム (メインではなく WinMain) を使用して子プロセスを作成しても、コンソール ウィンドウは消えません。どうやら、_popen 通信を容易にするために、オペレーティング システムによってコンソールが割り当てられているようです。

サードパーティの DLL は不安定ですが、独自のハードウェアとのインターフェイスに必要であることに注意してください。したがって、DLL を GUI アプリケーションのメモリ空間にロードする方法は受け入れられません。

4

3 に答える 3

1

親 GUI アプリケーションと非表示の子コンソール アプリケーションとの間で通信するには、次の MSDN 記事を参照してください。

于 2009-08-19T13:37:55.277 に答える
1

1) STARTUPINFO を設定してウィンドウを非表示にして起動するという考えを支持します。これは Windows 上の SOP であるため、Unix SOP を強制しようとするよりもうまく機能します。さらに、単独でテストするときに出力を確認したい場合があります。

2) または、ウィンドウを表示しない GUI アプリを作成することもできます。これは、コンソールのないコンソール アプリに相当します。

編集

Indeera が投稿したリンクは、2 番目のオプションの実行方法を示しています。

編集

親に情報を送信するだけなら、ファイルに書き込むのが最も簡単な方法です。これを秩序正しく保つ方法の 1 つは、親が一意のファイル名をコマンド ライン パラメータとして渡し、子が書き込むことです。親はファイルを監視し、その内容を操作できます。

多くの代替手段があります。これまでに説明した 2 つのアプローチに最も近いのは名前付きパイプですが、ソケット ベースの IPC など、さまざまな形式の IPC を使用することもできます。

ただし、コンソールなしで stdin/stdout/stderr にアクセスすることはできません。非表示のコンソールで起動できますが、実際にはコンソールが必要です。

編集

lua では、cmd.exe ではなく、実行可能ファイルを直接実行できますか?

于 2009-08-18T19:08:04.333 に答える
0

コンソールを起動せずに stdin/stdout を使用することはできないと思います。ただし、できることは、ウィンドウを表示しない GUI アプリとしてラッパー アプリを作成し (main() を winmain() に切り替えるだけ)、ソケットや共有メモリなどの IPC メカニズムを使用することです。

于 2009-08-18T19:08:34.397 に答える