Win32APIのLinux/Unix stdio.h popen()関数に大まかに相当するものはありますか?もしそうなら、どこでそれを見つけることができますか?
編集:D標準ライブラリの省略にパッチを当てるには、これを知る必要があります。すべての回答は、標準のWin32 APIのみを使用する必要があり、MSVC固有の関数は使用しないでください。また、それが存在する場合、私はひどく低レベルではないものを好みます。
MSDN では、パイプ ハンドルの継承で Windows API を使用して popen が行うことを説明しています。ここでは、十分に文書化された例を提供します。これは、Jason によってリンクされたランタイム ライブラリにある関数よりもはるかに低レベルですが_popen
、Win32 API のみを使用します。
_popen
コンソール アプリケーションを作成している場合は、呼び出すことができます。詳細については、MSDN サイトのドキュメントを参照してください: http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx
残念ながら、それは特に簡単ではありません。
win32 関数 (CreatePipe) を使用してパイプを作成する必要があります。通常、サブプロセスに渡して継承できるようにするために、パイプの末尾 (DuplicateHandle) を複製する必要があります。したがって使用できません。
次に、CreateProcess (STARTUPINFO を含む多くの構造体ポインターを使用) を使用してプロセスを作成し、複製したハンドルを標準出力として STARTUPINFO に渡す必要があります。
次に、eof に到達するまで、パイプ (ReadFile など) の読み取り側から読み取ることができます。その後、さまざまな win32 ハンドルをすべて閉じてクリーンアップする必要があります。
古いスレッドを掘り起こす...
上記の Jason Coco の回答に反応し、リンクされた MSDN ページの主張に反して、最近ではコンソール以外のアプリから _popen() を呼び出すことが明らかに可能です。私はこれを QuickTime インポーター コンポーネント (基本的には変装した DLL) から呼び出します。コンソール ウィンドウが開きますが、それ以外は期待どおりの動作を示します。mingw32 の -mwindows オプションを使用して標準のコンソール ツールをコンパイルし、GUI アプリにすると、_popen は引き続き正しく動作します (ただし、別のコンソールからツールを実行してもコンソール ウィンドウは開きます。