powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно вызывать AttachConsole?
25 сообщений из 32, страница 1 из 2
Как правильно вызывать AttachConsole?
    #39818302
OleAutomator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день

Делаю приложение, которое может работать в гибридном режиме: из командной строки или из GUI

Привязывание к дочерней консоли делаю так:
Код: pascal
1.
2.
3.
4.
    if (not System.IsConsole) then
    begin
      System.IsConsole := AttachConsole(-1);
    end;



И консоль привязывается. Но возникают сложности
1. Не работают Write/Writeln, хотя GetStdHandle(STD_OUTPUT_HANDLE) возвращает валидное значение. Решаю самостоятельным выводом в консоль через WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), ...)
2. При запуске из cmd приложение выводит текст, но не завершается, пока я не нажму Enter, хотя Readln нигде не ставил.
3. Конструкция "приложение > текстовый файл" не работает, файл создаётся, но не заполняется

Как правильно работать с AttachConsole и выводом?
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818304
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OleAutomatorДелаю приложение, которое может работать в гибридном режиме: из командной строки или из GUI

Обломись, ничего хорошего из этого не выйдет. Даже после преодоления всех трудностей,
текст, выводимый тобой на консоль будет путаться с выводом остальных программ (включая cmd).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818307
OleAutomator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Почему оно должно путаться?
Утилиту вызывают из cmd, она выполняет свою работу - управление возвращается пользователю cmd
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818343
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OleAutomatorУтилиту вызывают из cmd, она выполняет свою работу - управление возвращается пользователю cmd

Вот тут ты сильно заблуждаешься: управление возвращается ещё до того, как утилита начинает
выполнять свою работу. За исключением вызова через "start /w".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818358
OleAutomator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Что Вы имеете ввиду?
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818391
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OleAutomatorDimitry Sibiryakov,

Что Вы имеете ввиду?

При вызове GUI-приложения из консоли - возврат к cmd происходит сразу после запуска приложения, а не после выхода из него.
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818401
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

А как консоль определяет: приложение консольное или GUI?
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818409
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГолландецА как консоль определяет: приложение консольное или GUI?
IMAGE_SUBSYSTEM_WINDOWS_CUI
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818417
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyIMAGE_SUBSYSTEM_WINDOWS_CUI

И именно из-за этого битика в заголовке экзешника и проистекает уныние при попытке сделать
универсальное приложение. Если он установлен - проблемы с одним режимом. Установлен - с
другим. И работа с этим битом осуществляется системой ещё до запуска приложения, так что
повлиять на это поведение "изнутри" невозможно. Отсюда в первом посте "обломись".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818432
OleAutomator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Большое спасибо

Вообще нам нужно не GUI + Console, а Service + Standalone Console. Кто-нибудь знает, какие приятные и неприятные сюрпризы ожидают, если {$APPTYPE CONSOLE} запускать как сервис?
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818438
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OleAutomatorкакие приятные и неприятные сюрпризы ожидают, если {$APPTYPE CONSOLE} запускать как сервис?

Недоступность Input/Output и всё. Большинство сервисов в Windows собрано как раз как
консольные приложения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818443
OleAutomator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Большое спасибо
Может ещё скажите, можно ли определить... консольное приложение запускается самостоятельно или из родительской консоли?
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818464
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OleAutomatorможно ли определить... консольное приложение запускается самостоятельно или из
родительской консоли?

Прямо сходу я такого способа не помню. А какой в этом смысл?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818539
OleAutomator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Например, изменить заголовок и размеры в случае самостоятельного запуска
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818559
black-manatee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я делал GUI приложение, которое может запускаться как windows сервис.
Примерно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Uses Vcl.Forms, Vcl.SvcMgr....
......

begin
  if ..... если в GUI режиме....... then
  begin
    Vcl.Forms.Application.Initialize;
    Vcl.Forms.Application.MainFormOnTaskbar := True;
    Vcl.Forms.Application.CreateForm(TfmMain, fmMain);
    Vcl.Forms.Application.Run;
  end else
  begin
    if not VCL.SvcMgr.Application.DelayInitialize or VCL.SvcMgr.Application.Installing
      then VCL.SvcMgr.Application.Initialize;
    VCL.SvcMgr.Application.CreateForm(TRLService, RLService);
    VCL.SvcMgr.Application.Run;
  end;
end;



А вот делать консоль + GUI, я думаю что если и получится, то оно может работать по разному в Win7, Win10, Win Server и т.д.
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818731
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OleAutomatorНапример, изменить заголовок и размеры в случае самостоятельного запуска

Менять заголовок на время работы будет правильным в любом случае. Это приятно когда на
таскбаре отображается информация от текущего процесса.

Смотрю вот MSDN и думаю, что лично я бы попробовал задействовать GetConsoleProcessList()
если не будет лучшей идеи.

black-manateeПримерно так

Ужоснах. Гораздо проще будет не использовать VCL-ную обвязку для сервиса, тогда этот
говнокод сводится к вызову одной функции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818737
black-manatee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovOleAutomatorНапример, изменить заголовок и размеры в случае самостоятельного запуска

Менять заголовок на время работы будет правильным в любом случае. Это приятно когда на
таскбаре отображается информация от текущего процесса.

Смотрю вот MSDN и думаю, что лично я бы попробовал задействовать GetConsoleProcessList()
если не будет лучшей идеи.

black-manateeПримерно так

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

Можно привести примерчик ?
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818745
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
black-manateeМожно привести примерчик ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if StartServiceCtrlDispatcherW(@ServiceTable)=0 then
  begin
   err = GetLastError();
   if err = ERROR_FAILED_SERVICE_CONTROLLER_CONNECT then // not run from service manager
    begin
     Application.Initialize;
     Application.CreateForm(TFrmMain, FrmMain);
     Application.Run;
    end
   else
     WriteLog('Service initialization error ', err);
  end


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818795
black-manatee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovblack-manateeМожно привести примерчик ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if StartServiceCtrlDispatcherW(@ServiceTable)=0 then
  begin
   err = GetLastError();
   if err = ERROR_FAILED_SERVICE_CONTROLLER_CONNECT then // not run from service manager
    begin
     Application.Initialize;
     Application.CreateForm(TFrmMain, FrmMain);
     Application.Run;
    end
   else
     WriteLog('Service initialization error ', err);
  end




Ну и... Чем Ваш говнокод отличается от моего. Разница лишь в том, что я конкретно запускаю либо как сервис, либо как ГУИ, а Вы пытаетесь сперва запустить как сервис, а уже потом, при ошибке запускать как ГУИ. Ну так я так и хотел сделать по ряду причин. В остальном, мой говнокод менее говнокодистый чем Ваш. Ну вот не сторонник я таких конструкций типа:
if(+-~!*&++a)...
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818805
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После вызова StartServiceCtrlDispatcher не работают ShowMessage и т.п.
Поэтому, важно определить до ее вызова, будет ли сервис или GUI.

Удобно такое делать исключительно для отладки.. Когда не надо запускать как сервис и аттачится, а просто запустил...

Подробнее здесь: 21315011
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818819
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteПосле вызова StartServiceCtrlDispatcher не работают ShowMessage и т.п.

После успешного - да. Ибо какой ещё ShowMessage из сервиса?..

X-Citeважно определить до ее вызова, будет ли сервис или GUI.

Как? Телепатия? Сервис использует ту же самую точку входа, что и обычное приложение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818824
black-manatee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovX-CiteПосле вызова StartServiceCtrlDispatcher не работают ShowMessage и т.п.

После успешного - да. Ибо какой ещё ShowMessage из сервиса?..

X-Citeважно определить до ее вызова, будет ли сервис или GUI.

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


Мировая инженерная мысль уже придумала настройки, реестр, конфигурационные файлы, параметры командной строки и прочие прикольные штуки.
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818830
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovX-CiteПосле вызова StartServiceCtrlDispatcher не работают ShowMessage и т.п.

После успешного - да. Ибо какой ещё ShowMessage из сервиса?..

X-Citeважно определить до ее вызова, будет ли сервис или GUI.

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

Рабочая станция разная у сервиса и у GUI, по ней можно определить как запускается приложение имея одну точку входа. Пример выше..
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39818869
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
black-manateeМировая инженерная мысль уже придумала настройки, реестр, конфигурационные файлы,
параметры командной строки и прочие прикольные штуки.

А мировая мысль работников саппорта уже прокляла этих инженеров, поскольку засыпана
запросами от пользователей, которые, наплевав на документацию, установили и настроили не
так в результате чего у них "ничего не работает".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно вызывать AttachConsole?
    #39825823
OleAutomator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

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

Ещё кейс. В режиме отладки мы выставляем ReportMemoryLeaksOnShutdown в True. И когда приложение кем-то запускается - нет проблем, информация пишется в консоль. Но в standalone нам нужно в finalization выставлять IsConsole в False - чтобы разработчик был информирован об утечке в отдельном окне.

Хотелось бы сделать это красиво.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно вызывать AttachConsole?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]