Как создать скрытое одноразовое консольное приложение и общаться с ним?
Я написал небольшое консольное приложение, чтобы обернуть стороннюю DLL, которая имеет проблемы. Я звоню из приложения с графическим интерфейсом, используя _popen, и просто хочу прочитать значение из стандартного вывода консольной программы. При этом на короткое время отображается нежелательное окно консоли.
Я знаю, что этого можно избежать, используя определенную конфигурацию STARTUPINFO с CreateProcess. Однако я бы предпочел поместить это исправление в консольное приложение и по-прежнему использовать _popen. Создание дочернего процесса с использованием подсистемы Windows (т. Е. WinMain вместо main) не приводит к исчезновению окна консоли. Очевидно, операционная система выделяет консоль для облегчения связи _popen.
Обратите внимание, что сторонние библиотеки DLL нестабильны, но необходимы для взаимодействия с проприетарным оборудованием. Поэтому любой подход к загрузке DLL в область памяти приложений GUI недопустим.
3 ответа
1) Я поддерживаю идею запуска с установленным STARTUPINFO, чтобы скрыть окно. Это SOP в Windows, поэтому он будет работать лучше, чем пытаться навязать Unix SOP. Более того, вы можете захотеть увидеть результат при тестировании в отдельности.
2) Или вы можете создать приложение с графическим интерфейсом, которое никогда не показывает окно. Это составляет консольное приложение без консоли.
редактировать
Ссылка, опубликованная Indeera, показывает, как сделать второй вариант.
редактировать
Хорошо, если все, что вам нужно, это отправить информацию родителю, самый простой способ - написать файл. Один из способов сохранить это упорядоченность состоит в том, чтобы родительский элемент передавал уникальное имя файла в качестве параметра командной строки, в который записывается дочерний элемент. Родитель может следить за файлом и воздействовать на его содержимое.
Есть много альтернатив. Наиболее близким к двум обсуждаемым подходам были бы именованные каналы, но вы также можете использовать различные формы IPC, в том числе на основе сокетов.
Однако вы не можете получить доступ к stdin/stdout/stderr без консоли. Вы можете запустить со скрытой консоли, но на самом деле она должна быть.
редактировать
Позволяет ли lua запускать исполняемый файл напрямую, а не через cmd.exe?
Чтобы установить связь между родительским приложением GUI и скрытым дочерним консольным приложением, обратитесь к следующим статьям MSDN:
Я не думаю, что вы можете использовать stdin / stdout без запуска консоли. Что вы можете сделать, так это написать приложение-обертку как приложение с графическим интерфейсом, которое не отображает никаких окон (просто переключите main() на winmain()), а затем используйте какой-либо механизм IPC, например сокет или разделяемую память.