Скрытие консоли в виндовс

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 10.10.2019 14:05:45

Дож писал(а):Я рад, что вы не отрицаете моего утверждения и согласны с тем, что из нормального и костыльного решения задачи выбрали костыльный. Странно при этом, что пеняете на винду, а не на свой подход.

Советом вашим, разумеется, не воспользуюсь.


Нет, нормального решения в костыльной винде не оставлено. Если вы его там видите, так это галлюционации и склонность доверять рекламе.

Добавлено спустя 11 минут 20 секунд:
Снег Север писал(а):Сквозняк, я не понимаю на что вы жалуетесь. Вы написали консольное приложение и у него вылезает консоль. А как может быть еще?
Вы бы еще пожаловались, что в в дождь с неба вода капает... :D

Кстати, элементарно гуглится пример для делфи, как перенаправить консольный вывод другой программы, запускаемой из приложения, в какой-нибудь StringList. Я сам таким пользовался, когда мне надо было перехватывать такие сообщения от ffmpeg.


А в линуксе всё работает и без такой лажи, там только отрубальщик для лога нужен:
Код: Выделить всё
{$GOTO ON}
{$mode fpc}
{$R+}
//Программа для оперативного слежения
//за размером файла лога ~/.xsession-errors и оперативного
//уменьшения размера занимаемого им пространства

uses
sysutils,unix;

var
F: file;
q64: int64;
flag2: longint;
Z5: ansistring;

label
1;

begin
writeln('Программа для оперативного слежения '+
'за размером файла лога ~/.xsession-errors и оперативного '+
  'уменьшения размера занимаемого им пространства');
flag2:=1000;
Z5:=SysUtils.GetEnvironmentVariable('HOME');
1:
system.Assign(F, Z5+'/.xsession-errors');
reset(F,1);
q64:=FileSize(F);
//writeln(q64);
if q64>200000000 then begin
               system.seek(F,50000);
               system.Truncate(F)
                        end;
if q64>400000000000 then begin
         if flag2=1000 then fpsystem('konsole -e laza_konfiga.sh');
         flag2:=0;
                         end;
system.close(F);
sleep(30000);
goto 1;
end.

Ну так и в винде какие-то нагугленные команды вводят чтобы сообщениями об ошибках бинарная утилита не засиралась. В маздайке специально поломаны естественные инструменты чтобы вынудить народ использовать их непотребство и писать ни с чем не совместимый код.

Перенаправление консольного выхлопа даёт удивительные результаты! Можно перенаправить в нулевое устройство вместе с консольным текстом ещё до кучи и звук издаваемый приложением. Заранее не знаешь, что ещё перенаправится. А оно такое всегда надо? Потому, самое лучшее решение это скрыть консоль и пусть туда пишется. Пока искал это решение наткнулся на такой вариант: чистить строчки из консоли чтобы та не появлялась. Все строки что в неё помещаются. Вот где жесть.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Снег Север » 10.10.2019 16:14:06

Сквозняк, то, что вы именуете "естественные инструменты", для меня - бессмысленные извращения. К которым, прежде всего, относится "консольный выхлоп". Если программе есть что сообщать, она должна писать либо в текстовый файл, либо в БД, либо в компонент графической экранной формы. Консольное говно мамонта - результат лени програмистов.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 10.10.2019 16:52:28

Снег Север, для вас и монитор не нужен, хватит и принтера с бумажной лентой, которую может читать не ленивый пользователь. Две сущности для вывода по вашему не нужны, т.к. одна из них говно мамонта. Не ленивые программисты должны находить на распечатке нужную информацию вручную или при помощи автоматического сканера, а потом кнопочками набирать на форме, которая в каждой версии разная. Это по виндовому, это правильно! Да, и базу данных нужно распечатывать на ленте, а считывать сканером, потому что прочие способы, они от лени и говно мамонта.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Снег Север » 10.10.2019 17:53:06

Сквозняк, меня еще во времена ЕС1022 и Фортрана научили, что только особо продвинутые программисты выдают в выхлоп тонны дерьма, в котором потом другим надо что-то разыскивать. Тупые программисты, вроде меня, предпочитают анализировать проблемы в самой программе, а в выхлоп выдавать только самое существенное. И выхлоп этот должен никакого отношения к консоли не иметь, по меньшей мере, с 1995-го года (Windows 95).
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 10.10.2019 18:18:33

Снег Север, ну-ну, значит сложной логики никогда не писали, а только сопрягали водопроводные и канализационные трубы между блоками. Если что, консоль, это почти тоже самое что и форма, но не напрягающее средства разработчика. Во времена фортрана наверно ещё не додумались выводить в консоль информацию интерактивно, по нажатию клавиши или кнопки джойстика. Задолбаетесь файл каждый раз после добавления информации обновлять, это получается заход Солнца вручную. Файл для записи отладки нужен тогда, когда или консоль недоступна, или информации тонны.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Снег Север » 11.10.2019 07:04:37

Сквозняк, понять кайф от секс в гамаке мне не суждено.
"Сложная логика" - это создать на пустом месте себе проблемы, а потом героически преодолевать? Да, такого я стараюсь избегать. Интерактивная консоль - это страшный сон времен ДОСа. Который в винде, к великому счастью, можно забыть.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Скрытие консоли в виндовс

Сообщение olegy123 » 11.10.2019 08:20:39

Дож писал(а):В винде у приложений есть тип -- он может быть GUI или CONSOLE -- и в зависимости от этого типа приложение ведёт себя немного по-разному. Одно из таких различий: если бы вы скомпилировали программу с директивой {$APPTYPE GUI}, то ваше приложение запускалось бы без консоли с самого начала (и без всяких SW_HIDE).

в винде есть еще ряд приложений которые могут работать в фоне это сервисы и драйверы.
Кстати, чтобы приложение юзеру не выводило в винде можно запустить из другого юзера например system. Там даже GUI не увидите..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Скрытие консоли в виндовс

Сообщение mig-31 » 11.10.2019 12:26:33

Снег Север писал(а):меня еще во времена ЕС1022 и Фортрана научили, что только особо продвинутые программисты выдают в выхлоп тонны дерьма, в котором потом другим надо что-то разыскивать. Тупые программисты, вроде меня, предпочитают анализировать проблемы в самой программе, а в выхлоп выдавать только самое существенное. И выхлоп этот должен никакого отношения к консоли не иметь, по меньшей мере, с 1995-го года (Windows 95).

Вас правильно учили, как это надо делать для древней как говно мамонта Windows из которой MS$ после Windows NT4, фактически выпилила консоль а потом спосхаватились и запилили PowerShell.
Выхлоп в терминал в UNIX/LINUX весьма удобаная вещь: хочете выводите в терминал, хочете выводите в файл или в нулевое устройство и текстовый файл не обязателен.
Снег Север писал(а): Если программе есть что сообщать, она должна писать либо в текстовый файл, либо в БД, либо в компонент графической экранной формы. Консольное говно мамонта - результат лени програмистов.

На GUI уходит дофига времени при написании кода с нуля, так что терминал был, есть и будет на UNIX/LINUX.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: Скрытие консоли в виндовс

Сообщение Снег Север » 11.10.2019 15:26:23

mig-31 писал(а):На GUI уходит дофига времени при написании кода с нуля

Никогда еще не читал ничего смешнее...
Хотя, если GUI разрабатывать в блокноте или как там в линухах он называется, то возможно...
Сегодня интерактивная программа без GUI - это злостное издевательство над пользователем. "Головотяпство со взломом", как писали классики.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 12.10.2019 10:34:23

Снег Север писал(а):Сквозняк, понять кайф от секс в гамаке мне не суждено.
"Сложная логика" - это создать на пустом месте себе проблемы, а потом героически преодолевать? Да, такого я стараюсь избегать. Интерактивная консоль - это страшный сон времен ДОСа. Который в винде, к великому счастью, можно забыть.


Вы ничего полезного не подсказали кроме как поклониться в ножки Биллу Гейтсу и всем заместителям его, и с ними заниматься сексом в джакузи, а также писать тупые неконкурентоспособные программы. Внезапно, тупые проги уже почти все написаны, а для написания ненаписанных нужно куда-то далеко ехать, куда другие писатели тупых программ не успели добраться. Спасибо за ваши неконструктивные антисоветы. А последней народной винде месяц или два поддержки остался, а потом звиздец - жрите говнецо любители мелкософта! Ваш мелкософт запрещает производителям железяк писать драйвера на свои изделия, которые он решил закопать и пофигу на пользователей которые хотят их установить. Кто-то на тытрубе учил как поставить семёрку на новый ноут ХП: найти такой же старый, подключить к нему винт от нового, установить семёрку, напихать дров от восьмёрки и подключить к новому ноуту. Это даже не секс в гамаке, это групповой изврат стоя на движущемся мотоцикле.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Alex2013 » 12.10.2019 11:47:33

Вообще-то по настоящему умные программы просто перехватывают консольный ввод/вывод (там где есть в этом это есть нужда) и выводят в обычное GUI окно .
В простейшем варианте как-то так ...
Код: Выделить всё
procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors:
  TStringList);
var
  sa: TSECURITYATTRIBUTES;
  si: TSTARTUPINFO;
  pi: TPROCESSINFORMATION;
  hPipeOutputRead: THANDLE;
  hPipeOutputWrite: THANDLE;
  hPipeErrorsRead: THANDLE;
  hPipeErrorsWrite: THANDLE;
  Res, bTest: Boolean;
  env: array[0..100] of Char;
  szBuffer: array[0..256] of Char;
  dwNumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  sa.nLength := sizeof(sa);
  sa.bInheritHandle := true;
  sa.lpSecurityDescriptor := nil;
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
  CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
  ZeroMemory(@env, SizeOf(env));
  ZeroMemory(@si, SizeOf(si));
  ZeroMemory(@pi, SizeOf(pi));
  si.cb := SizeOf(si);
  si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  si.wShowWindow := SW_HIDE;
  si.hStdInput := 0;
  si.hStdOutput := hPipeOutputWrite;
  si.hStdError := hPipeErrorsWrite;

  (* Remember that if you want to execute an app with no parameters you nil the
     second parameter and use the first, you can also leave it as is with no
     problems.                                                                 *)
  Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi);

  // Procedure will exit if CreateProcess fail
  if not Res then
  begin
    CloseHandle(hPipeOutputRead);
    CloseHandle(hPipeOutputWrite);
    CloseHandle(hPipeErrorsRead);
    CloseHandle(hPipeErrorsWrite);
    Exit;
  end;
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeErrorsWrite);

  //Read output pipe
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead,
        nil);
      if not bTest then
      begin
        break;
      end;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
    end;
    Stream.Position := 0;
    Output.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;

  //Read error pipe
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead,
        nil);
      if not bTest then
      begin
        break;
      end;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
    end;
    Stream.Position := 0;
    Errors.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;

  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeErrorsRead);
end;

(* got it from yahoo groups, so no copyrights for this piece :p and and example
   of how to use it. put a button and a memo to a form.                      *)

procedure TForm1.Button1Click(Sender: TObject);
var
  OutP: TStringList;
  ErrorP: TStringList;
begin
  OutP := TStringList.Create;
  ErrorP := TstringList.Create;

  ExecConsoleApp('ping localhost', OutP, ErrorP);
  Memo1.Lines.Assign(OutP);

  OutP.Free;
  ErrorP.Free;
end;
Последний раз редактировалось Alex2013 12.10.2019 12:02:44, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: Скрытие консоли в виндовс

Сообщение Снег Север » 12.10.2019 12:01:58

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

+1

Добавлено спустя 1 минуту 45 секунд:
Сквозняк писал(а):Вы ничего полезного не подсказали кроме как поклониться в ножки Биллу Гейтсу

вы ничего умного не сказали кроме того, что красноглазики по-прежнему молятся на решения полувековой давности. Да, я над этим и смеюсь.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Alex2013 » 12.10.2019 12:18:57

Торвальд Линукс тоже не икона ... Специально "для отъезжающих"! 8)
MS DOS Первый выпуск Август 1981 (Основана на CP/M (клон) и ... внезапно Unix(базовые функции) )
Linux Первый выпуск 17 сентября 1991
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 12.10.2019 16:08:29

Снег Север писал(а):вы ничего умного не сказали кроме того, что красноглазики по-прежнему молятся на решения полувековой давности. Да, я над этим и смеюсь.

Внезапно, эта тема посвящена проблемам при портировании умных программ, которые вы советовали не писать, в ОС, которой в качестве основной пользуются рабы Билли и его заместителей. А пользы от вас здесь даже не 0 а отрицательная величина.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Снег Север » 12.10.2019 16:35:41

Сквозняк писал(а):которой в качестве основной пользуются рабы Билли и его заместителей

:roll:
Линух явно вредно влияет на психику... :mrgreen:
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

Рейтинг@Mail.ru