Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
ВнизКак оставить консольное прилож. работать, убрав консольное окно? Найти похожие ветки
← →
Vorobyev Sergey (2003-09-20 08:22) [0]Привет всем?
Можно ли проделать следующее:
В дельфи пишется консольное приложение ({$APPTYPE CONSOLE}
)
После проведения различных инициализирующих действий с выводом информации в консоль (WriteLn
) нужно убрать эту самую консоль и оставить работать это приложение в памяти.
То есть, например, запускают эту программу из Far-а (или cmd.exe). Сообщения инициализации выводятся в консоль Far-а (или cmd), затем консоль освобождается (можно дальше работать в Far-е), а программа остается в памяти выполнять свои задачи..
Замечу, что программа должна быть как можно проще, без всяких bat-файлов, не GUI и небольшого размера..
← →
jack128 (2003-09-20 11:07) [1]Не знаю, что будет с консолью фара, но попробуй так
FreeConsole();
← →
iWorm (2003-09-22 02:18) [2]Я думаю, что можно вообще не писать косольное приложение...
Повторяю это мое личное мнение на данный момент...
Я думаю, что размер не такой уж будет и большой если *.dpr подрихтовать вот так:
Наример вот программка, которая за время свое "жизни" всего навсего ищет окно винампа и ставит предыдущую песню:
program Project1;
uses
messages,
windows;
var
h: HWND;
{$R *.res}
begin
h := findwindow("winamp v1.x",
nil);
if h <> 0 then
sendmessage(h,
WM_COMMAND,
40044,
0);
end.
это все компилится в 9 кб, а если еще и иконку программы убрать, то и вовсе 8!
В принципе можно использовать и юниты, пример для наглядности...
С уважением, Иван Семенов
← →
webpauk (2003-09-22 10:38) [3]
{$APPTYPE CONSOLE})
- убери этот код и окно исчезнет
← →
PVOzerski (2003-09-22 11:05) [4]IMHO, через Pipes, перенаправив I/O куда-нибудь (скажем, в nul, а лучше, какой-нибудь программе, чтобы анализировать и управлять). Правда, консоли не будет видно с самого начала. Если же сделать по совету [3], прога может начать валиться на всех консольных I/O операциях (readln, writeln и т.п.).
← →
Vorobyev Sergey (2003-09-22 11:40) [5]Консоль мне нужна (ну люблю я консольные приложения и вывод в консоль - это просто и наглядно ИМХО для простых приложений и глюков почти нет)
{$APPTYPE CONSOLE}
конечно можно убрать, а чтобы программа "не валилась" на консольных операциях можно создать свою консоль AllocConsole (тогда при запуске например из фара будет создаваться другая консоль, убрать консоль FreeConsole)..
Я по сути сейчас так и делаю:
1. AllocConsole (новая консоль)
2. Инициализация, Write; WriteLn (тексты выводятся в консоль)
3. FreeConsole (консоль освобождается)
4. Программа остается в памяти
Но если сделать {$APPTYPE CONSOLE}, то новая консоль не будет создаваться (если вызвали из консоли например фара), а тексты сообщений будут выводится в эту консоль.
Только эту консоль не уберешь, пока программа не завершится, а надо чтобы программа осталась в памяти (причем без создания всяких других процессов и т.п.). Я понимаю, что это скорее всего невозможно,
А ВДРУГ КТО ЗНАЕТ???
← →
PVOzerski (2003-09-22 11:48) [6]Может, оно и выпедреж, и не самый лучший способ, но вот возможное решение. Пусть консольной будет программа-загрузчик, которая загрузит 2-ю (GUI), пока надо, пообщается с ней (скажем, через DDE), а потом завершится, оставив 2-ю работать.
← →
Vorobyev Sergey (2003-09-22 12:08) [7]
> Может, оно и выпедреж, и не самый лучший способ, но вот
> возможное решение. Пусть консольной будет программа-загрузчик,
> которая загрузит 2-ю (GUI), пока надо, пообщается с ней
> (скажем, через DDE), а потом завершится, оставив 2-ю работать.
Мне все-таки "дешевле" выводить в другую консоль, чем выходить из положения так.. Но, спасибо..
Теперь меня уже принципиально интересует, возможно ли это сделать из одной и той же программы.. Может вообще это ОС не позволяет ?
← →
PVOzerski (2003-09-22 12:11) [8]У меня такое впечатление, что именно такое делает сервер MySQL. Но как - не разбирался.
← →
Kiddy (2003-09-22 14:42) [9]Мысли вслух... Как насчет двухпоточного приложения. Первый поток выводит консоль, инициализирует второй поток, а потом завершается, остовляя второй процесс работать в памяти....
← →
Vorobyev Sergey (2003-09-22 15:00) [10]
> Kiddy © (22.09.03 14:42) [9]
Простите, но мне кажется вы не совсем понимаете суть вопроса и обсуждения.. (еще раз простите)
С выводом на консоль, инициализацией и закрытием консоли проблем нет.. (см. [7]).
Для этого не надо два потока.. Тем более, чтобы оставить процесс работать в памяти..
← →
Kiddy (2003-09-22 16:37) [11]По сути я предложил то же что и PVOzerski только в рамках одного приложения... сам я такого не делал, но думаю что можно. Первый процесс выводит в кансоль, например Far-a, и запускает второй процесс, а сам завершается. Я не знаю как это поведет себя в реале, но это будет одно приложение, что и требуется в принципе.
← →
nikkie (2003-09-22 19:06) [12]логично было бы FreeConsole, но не работает... :(
видимо единственный вариант - с двумя процессами, как уже предлагали. но через DDE и т.п. - имхо не нужно. предлагаю такой вариант:
1 программа - основная, консольная.
2 программа - стартер, тоже консольный.
стартер создает pipe и через CreateProcess с флагом STARTF_USESTDHANDLES стартует основную программу, перенаправив stdout/stderr. читает из pipe и выводит в консоль.
основная программа пишет с помощью Writeln, а по окончанию инициализации пишет определенную строку (пустую или exit?) или символ (Ctrl+Z?), по получении которой стартер закрывает pipe и завершает работу. основная программа продолжает работу.
преимущество - основную программу переписывать не надо. надо только написать стартер. а стартер получится универсальным, может быть использован с другими программами. :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c