Qual é o equivalente a Posix popen () na API do Win32?

Existe um equivalente aproximado à function stdio.h popen () do Linux / Unix na API do Win32? Se sim, onde posso encontrá-lo?

Edit: Eu preciso saber isso para corrigir uma omissão na biblioteca padrão D. Qualquer resposta deve usar apenas a API Win32 padrão, sem funções específicas do MSVC. Além disso, prefiro algo que não seja terrivelmente baixo, se existir.

O MSDN explica como você faz o que o popen faz usando a API do Windows no Pipe Handle Inheritance . Aqui ele fornece um exemplo bem documentado. É muito mais baixo nível do que a function _popen encontrada na biblioteca de tempo de execução vinculada por Jason, mas usa exclusivamente a API do Win32.

Você pode chamar _popen se estiver escrevendo um aplicativo de console. Para obter mais informações, consulte a documentação no site do MSDN: http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx

Infelizmente não é particularmente fácil.

Você precisa criar um pipe usando a function win32 (CreatePipe), então normalmente você precisa duplicar o final do pipe (DuplicateHandle) que você está dando ao subprocess para permitir que ele seja herdado, caso contrário não será portanto não pode ser usado.

Em seguida, você precisará criar um processo usando CreateProcess (que recebe muitos pointers de estrutura, incluindo um STARTUPINFO) e passar o comando STARTUPINFO para o identificador duplicado como stdout.

Então você pode ler a partir do final da leitura do tubo (ReadFile etc) até chegar a eof, então você precisa limpar fechando todos os vários identificadores win32.

Desenterrando um velho fio …

reactjs à resposta de Jason Coco acima, e ao contrário do que a página do MSDN vinculada afirma, é aparentemente possível hoje em dia chamar _popen () de aplicativos não-console. Eu chamo de um componente importador do QuickTime, basicamente uma DLL disfarçada. Ele abre uma janela do console, mas mostra o comportamento esperado. Compilando uma ferramenta de console padrão com a opção -mwindows do mingw32 para torná-lo um aplicativo GUI, _popen continua a funcionar corretamente (mas uma janela de console é aberta mesmo quando a ferramenta é executada em outro console.