33

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

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

4

5 に答える 5

26

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

于 2009-01-16T16:12:55.717 に答える
21

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

于 2009-01-16T16:07:19.893 に答える
3

残念ながら、それは特に簡単ではありません。

win32 関数 (CreatePipe) を使用してパイプを作成する必要があります。通常、サブプロセスに渡して継承できるようにするために、パイプの末尾 (DuplicateHandle) を複製する必要があります。したがって使用できません。

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

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

于 2009-01-19T21:38:38.547 に答える
3

古いスレッドを掘り起こす...

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

于 2012-11-27T01:49:51.430 に答える