Подтвердить что ты не робот

Что эквивалентно Posix popen() в Win32 API?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

Копаем старую нить...

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