Что эквивалентно Posix popen () в Win32 API? - PullRequest
24 голосов
/ 16 января 2009

Есть ли грубый эквивалент функции Linux / Unix stdio.h popen () в Win32 API? Если так, где я могу найти это?

Edit: мне нужно знать это, чтобы исправить пропущение в стандартной библиотеке D. Любой ответ должен использовать только стандартный Win32 API, без MSVC-специфических функций. Кроме того, я бы предпочел что-то, что не ужасно низкоуровневое, если оно существует.

Ответы [ 4 ]

20 голосов
/ 16 января 2009

MSDN объясняет, как вы делаете то, что делает popen, используя Windows API в Наследование дескриптора трубы . Здесь это хорошо документированный пример. Это намного более низкий уровень, чем функция _popen, найденная в библиотеке времени выполнения, связанной Джейсоном, но использует исключительно Win32 API.

17 голосов
/ 16 января 2009

Вы можете позвонить _popen, если пишете консольное приложение. Для получения дополнительной информации см. Документацию на сайте MSDN: http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx

4 голосов
/ 20 января 2009

К сожалению, это не особенно легко.

Вам нужно создать канал, используя функцию win32 (CreatePipe), тогда обычно вам нужно продублировать конец канала (DuplicateHandle), который вы даете подпроцессу, чтобы он мог наследоваться, в противном случае он выиграл ' не может быть и, следовательно, не может быть использовано.

Затем вам нужно создать процесс, используя CreateProcess (который принимает множество структурных указателей, включая STARTUPINFO), и передать STARTUPINFO дескриптор, который вы продублировали, в качестве его стандартного вывода.

Затем вы можете читать с конца чтения канала (ReadFile и т. Д.), Пока не достигнете eof, затем вам нужно очиститься, закрыв все различные дескрипторы win32.

1 голос
/ 27 ноября 2012

Копаем старую ветку ...

Реагируя на ответ Джейсона Коко, приведенный выше, и вопреки тому, что утверждает связанная страница MSDN, в настоящее время, по-видимому, можно вызывать _popen () из неконсольных приложений. Я называю это из компонента импорта QuickTime, в основном скрытой DLL. Он открывает окно консоли, но в противном случае показывает ожидаемое поведение. Скомпилировав стандартный инструмент консоли с параметром -mwindows mingw32, чтобы сделать его приложением с графическим интерфейсом, _popen продолжает работать правильно (но окно консоли открывается даже при запуске инструмента из другой консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...