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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

Это старый пост, но несколько лет назад мне также понадобилось использовать вызов типа popen() в среде Windows. Как отмечается в нескольких комментариях в ответе, использование Windows API для реализации чего-либо, близкого к классическому POSIX popen() интересно.

Я создал реализацию, которую отправил в Code Review. Эта реализация использует pipes к stdin и из stdout, а также методы Windows для CreateProcess(...).

Связанный код предназначен для встраивания в dll с очень маленьким API.

int __declspec(dllexport) cmd_rsp(const char *command, char **chunk, unsigned int size); 

Простой пример использования:

#include "cmd_rsp.h"
int main(void)
{
    char *buf = {0};
    buf = calloc(100, 1);
    if(!buf)return 0;
    cmd_rsp("dir /s", &buf, 100);
    printf("%s", buf);
    free(buf);
    //or a custom exe
    char *buf2 = {0};
    buf2 = calloc(100, 1);
    cmd_rsp("some_custom_program.exe arg_1 arg_2 arg_n", &buf2, 100);
    printf("%s", buf2);
    free(buf2);
    
    return 0;
}

Требуется любая команда, которая может быть, например, выдана из stdin, создает отдельный процесс для выполнения команды, затем возвращает все содержимое ответа (если оно есть) в буфер и делает это без отображения всплывающего окна CMD. Буфер увеличивается по мере необходимости, чтобы соответствовать размеру ответа.

Другие вопросы по тегам