Windows, создание консольного приложения.

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Windows, создание консольного приложения.

Сообщение Seenkao »

Уже много времени борюсь, но так не могу найти способ избавится от "заднего" окна при создании консольного приложения. Окна командной строки, за основным экраном. Это конечно не критично, но напрягает.
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Windows, создание консольного приложения.

Сообщение sts »

подозреваю вы сами создаете консоль в коде и выставили директиву компилятора создавать консольную прогу, вот лишнее окно и появляется
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Re: Windows, создание консольного приложения.

Сообщение Seenkao »

Хорошо, но как тогда создать простое приложение без консоли? Не прибегая к методу удаления LCL из LCL.
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Windows, создание консольного приложения.

Сообщение sts »

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

директива компилятора - создавать консольную прогу как раз и управляет какой вариант кода в компилить в прогу, но это в делфе, возможно в фреепаскале както можно более гибко регулировать это.

теперь по существу

Seenkao писал(а):Хорошо, но как тогда создать простое приложение без консоли? Не прибегая к методу удаления LCL из LCL.


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

Добавлено спустя 1 час 8 минут 43 секунды:

Код: Выделить всё

program project1;
{$mode objfpc}{$H+}
{$apptype GUI}
uses
  windows;
begin
//  if AttachConsole(ATTACH_PARENT_PROCESS) = false then Assert(AllocConsole());
//  FreeConsole();
  AllocConsole();
  ReadLn;
end.


плохо что во фрипаскале такой код не работает, а в делфе работает.

Добавлено спустя 2 минуты 3 секунды:
самое забавное реализацию ReadLn не нашел в исходниках

Добавлено спустя 21 минуту 17 секунд:
вот это работает



Код: Выделить всё

program project1;
{$mode objfpc}{$H+}
{$apptype GUI}
uses
  windows;
begin
  AllocConsole();
  IsConsole:= true;
  SysInitStdIO;
  ReadLn;
end.
                                   
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Re: Windows, создание консольного приложения.

Сообщение Дож »

Хорошо, но как тогда создать простое приложение без консоли?

Достаточно указать в программе {$APPTYPE GUI} вместо {$APPTYPE CONSOLE}.

в винде нет понятия консольная программа

Есть -- программа может быть консольной, может быть гуишной. Это то, что вы выбираете при помощи $APPTYPE, что в итоге меняет IMAGE_OPTIONAL_HEADER.Subsystem исполняемого файла.
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Re: Windows, создание консольного приложения.

Сообщение Seenkao »

Благодарю!
Так же в Лазарусе можно сделать в "Параметры проекта" -> "Настройка и целевая платформа" поставить галочку "Графическое приложение Win32(-WG)"
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows, создание консольного приложения.

Сообщение Alex2013 »

Чуть строну то темы, но может пригодиться.
Открывает "временную " консоль из GUI приложения
(Тут уже ответили похожим образом но это все-же чуть "другая история" открыли написали и спросили что нужно и закрыли обратно ).

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
begin
AllocConsole;
   try
    IsConsole := True;
    SysInitStdIO;
      Writeln(UTF8ToConsole('123 нажмите ентер'));
      Readln;
   finally
    FreeConsole;
   end;
end;


Тоже самое но хитрее ... (Запускает командную консоль (или консольное приложение) прямо ВНУТРИ окна GUI приложения )

Запуск стороннего приложения на форме своего приложения
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Re: Windows, создание консольного приложения.

Сообщение Seenkao »

Alex2013, увы, не подходит. Если надо я и сам смогу создать дополнительное консольное окно. ))) Меня больше волновало то окно, которое создавал не я.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows, создание консольного приложения.

Сообщение Alex2013 »

Если напрягает окно вообще и хочется сделать ""программу-ниндзя" то можно сделать "сервис" (он же "демон" он же "служба")
http://www.freepascal.ru/article/lazarus/20090403120204
Инсталлировать его не обязательно он вполне запускается как обычное приложение.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Re: Windows, создание консольного приложения.

Сообщение Сквозняк »

Консоль же можно свернуть и пусть в неё что-то пишется. При этом свернутся все консоли, но они не пропадут, вручную их можно развернуть. А вот прибивание консоли нужно тестить на других приложениях, не прибьёт-ли консоли и у них.
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Re: Windows, создание консольного приложения.

Сообщение Seenkao »

Сквозняк, большинство пользователей, будет напрягать какое-то непонятно окно, которое вдруг появляется ни с того ни с сего. И при закрытии этого окна, вдруг закрывается программа...
Не хочешь объяснить это неопытному пользователю?

Данный вопрос, думаю интересует многих. Нужна отладка - делай окно, делай логирование. И проверяй.

Конечному пользоателю, это не нужно! Самый максимум что нужно предоставить пользователю, это логирование - достаточно ограниченное, чтоб можно было понять, где происходят проблемы программы.

Всё что нужно тебе - не значит нужно всем :)
Ответить