Как остановить появление окна консоли при выполнении системных вызовов? - PullRequest
2 голосов
/ 03 ноября 2011

Я использую C и GTK + для графического проекта. Для моего проекта мне нужно сделать много системных звонков. например, system («скопировать файл myfile»); или system («mp3player-embed filename») и т. д., и всякий раз, когда моя программа вызывает систему, появляется раздражающее окно консоли, которое остается видимым до тех пор, пока команда не будет полностью выполнена. Как мне скрыть это окно консоли? Спасибо.

ПРИМЕЧАНИЕ. Для своего проекта я могу использовать GTK +, стандартную библиотеку C, GLib, WinApi (не рекомендуется) и системные вызовы.

SCREENSHOT: annoying console window

Ответы [ 3 ]

2 голосов
/ 03 ноября 2011

Использование system() для создания нового процесса делает это, сначала запуская новый интерпретатор команд, который затем, в свою очередь, выполняет команду, переданную system().

Интерпретатор команд открывает окно консоли.

Таким образом, чтобы избежать открытия таких окон консоли, вам нужно избегать запуска интерпретатора команд. Чтобы выполнить последнее, попробуйте функцию из семейства spawn (http://msdn.microsoft.com/en-us/library/20y988d2.aspx) или используйте API-интерфейс win32 CreateProcess() (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425), чтобы напрямую запустить ваше приложение.

Побочным эффектом может быть то, что ваше приложение запускается быстрее, а также использует меньше системных ресурсов.

Фактически вышеупомянутые решения не будут работать для системных вызовов, которым явно нужен интерпретатор команд, как в одном из ваших примеров (copy src dst).

0 голосов
/ 07 ноября 2011

Используйте GLib обрабатывает функции порождения вместо специфичных для платформы функций.Для копирования файла вы можете использовать g_file_copy из GIO (поставляется с GTK) вместо вызова команды cp или copy.Это делает ваш код более переносимым.

0 голосов
/ 03 ноября 2011

Вот соответствующий ответ

Никогда не используйте putStr, print, getContents и т. Д. Если вы это сделаете, вы получите исключение, например «hPutChar (stdout): неверный дескриптор файла». Это связано с тем, что стандартный ввод / вывод / ошибка для программ с графическим интерфейсом Windows не подключен, и поэтому стандартные дескрипторы файлов недопустимы.

Способ скрыть окно консоли - передать специальный компоновщик при компиляции вашей программы:

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