web-dev-qa-db-ja.com

Win32APIのPosixpopen()に相当するものは何ですか?

Win32APIのLinux/Unix stdio.h popen()関数にほぼ相当するものはありますか?もしそうなら、どこでそれを見つけることができますか?

編集:D標準ライブラリの省略にパッチを当てるには、これを知る必要があります。すべての回答はのみ標準のWin32 APIを使用する必要があり、MSVC固有の関数は使用しません。また、それが存在する場合、私はひどく低レベルではないものを好みます。

25
dsimcha

MSDNは、 パイプハンドルの継承 でWindowsAPIを使用してpopenが行うことをどのように行うかを説明しています。 ここ 十分に文書化された例を提供します。これは、Jasonによってリンクされたランタイムライブラリにある_popen関数よりもはるかに低レベルですが、Win32APIのみを使用します。

コンソールアプリケーションを作成している場合は、_popenを呼び出すことができます。詳細については、MSDNサイトのドキュメントを参照してください。 http://msdn.Microsoft.com/en-us/library/96ayss4b(VS.80).aspx

17
Jason Coco

悲しいことに、それは特に簡単ではありません。

Win32関数(CreatePipe)を使用してパイプを作成する必要があります。その後、通常、サブプロセスに渡すパイプの終わり(DuplicateHandle)を複製して、継承できるようにする必要があります。そうしないと、継承されません。したがって、使用できません。

次に、CreateProcess(STARTUPINFOを含む多くの構造体ポインターを受け取る)を使用してプロセスを作成し、複製したハンドルを標準出力としてSTARTUPINFOに渡す必要があります。

次に、パイプの読み取り側(ReadFileなど)からeofに到達するまで読み取ることができます。その後、さまざまなwin32ハンドルをすべて閉じてクリーンアップする必要があります。

4
MarkR

古い糸を掘り起こす.。

上記のJasonCocoの返信に反応し、リンクされたMSDNページの主張に反して、最近ではコンソール以外のアプリから_popen()を呼び出すことが可能であるようです。 QuickTimeインポーターコンポーネントから呼び出します。基本的にはDLLを偽装します。コンソールウィンドウを開きますが、それ以外の場合は期待される動作を示します。mingw32の-mwindowsオプションを使用して標準のコンソールツールをコンパイルし、 GUIアプリ、_popenは引き続き正しく機能します(ただし、別のコンソールからツールを実行している場合でも、コンソールウィンドウが開きます。

1
RJVB