Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.011 c
4-18672
gaikin
2003-07-31 19:07
2003.10.06
Console


6-18531
BillyJeans
2003-08-11 09:49
2003.10.06
Как получить имя хоста зная его ip?


1-18386
Radeon
2003-09-22 17:40
2003.10.06
Чтение определённых символов из строки


1-18468
zerro_nuz
2003-09-24 11:54
2003.10.06
Помогите как вычесть из даты дату ?


1-18335
fc_off
2003-09-23 17:05
2003.10.06
Позиция курсора в TEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский