Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4      [все]
 CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Нужно создать временно невидимую консоль, а в случае AllocConsole + ShowWindow она всё равно успевает мелькнуть
В интернете прочёл, что можно вручную создать консоль в режиме временно невидимого окна
Но найденные куски кода пока к успеху не привели, CreateProcess возвращает False

Подскажите, какие параметры должны быть, чтобы повторить AllocConsole
Желательно куски кода
5 июн 18, 02:02    [21468383]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU,

Ну, например. С помощью CreateProcess создай "консольный" процесс. Например, cmd.exe.

В startUpInfo задай:

startUpInfo.wShowWindow := SW_HIDE;
startUpInfo.dwFlags := STARTF_USESHOWWINDOW;

- вот и будет консоль невидимой.

Потом присасываешься к консоли этого процесса:
    AttachConsole(ProcInfo.dwProcessId) 


Учти, что AttachConsole() может не сработать, ибо процесс создания консоли может быть еще в состоянии запуска.
Можно в цикле ждать успешного AttachConsole(),
    while not AttachConsole(ProcInfo.dwProcessId) do
      sleep(50);

или ещё как, в общем не маленький, сообразишь.

И завершаешь процесс
      TerminateProcess(ProcInfo.hProcess, fExCode);

Все.

function AttachConsole(dwProcessID: Integer): Boolean; stdcall; external 'kernel32.dll';

function CreateInvisibleConsole(): boolean;
var
  fAttached: Boolean;
  fExCode: Cardinal;
  stdOut: THandle;
  startUpInfo: TStartUpInfo;
  ProcInfo: TProcessInformation;
begin
  result := false;
  FillChar(startUpInfo, SizeOf(TStartUpInfo), 0);
  startUpInfo.cb := SizeOf(TStartUpInfo);
  startUpInfo.hStdOutput := stdOut;
  startUpInfo.wShowWindow := SW_HIDE;
  startUpInfo.dwFlags := STARTF_USESHOWWINDOW;


  if CreateProcess(Pchar('C:\Windows\system32\cmd.exe'), nil, nil, nil, true,
    NORMAL_PRIORITY_CLASS
    , nil, nil, StartupInfo, ProcInfo) then begin

    while not AttachConsole(ProcInfo.dwProcessId) do
      sleep(50);
    TerminateProcess(ProcInfo.hProcess, fExCode);

    writeln('test 1');
    writeln('test 2');
    writeln('test 3');

    result := true
  end;

end;
5 июн 18, 03:29    [21468399]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Спасибо
А StdOut чего не заполняешь?
5 июн 18, 09:32    [21468671]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
Да, ну ты уж сам там доделай.
5 июн 18, 11:34    [21469093]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Gator
Member

Откуда: Москва
Сообщений: 13824
А зачем на скрытой консоли?
5 июн 18, 11:39    [21469129]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
Нужно создать временно невидимую консоль

Главный вопрос: зачем? Второстепенный вопрос: при чём тут CreateProcess?

Posted via ActualForum NNTP Server 1.5

5 июн 18, 11:48    [21469172]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Ну я как раз не понимаю, что делать с StdOut/Input/Error
Поэтому и спрашиваю
5 июн 18, 12:01    [21469213]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Gator,

После создания консоли, я её настраиваю
Задаю размеры, область вывода, позиционирую в центр экрана, меняю Caption
Если создавать сразу видимую - то она неприятно моргает
5 июн 18, 12:03    [21469224]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28960

05.06.2018 11:48, Dimitry Sibiryakov пишет:
> Главный вопрос: зачем?

он мыслит "окошками".
пишет супер-пупер "сёрвис".
но окошко у сёрвиса быть должно.
(по мнению аффтора)

в общем - клиника.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 12:05    [21469238]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU
чччД__,

Ну я как раз не понимаю, что делать с StdOut/Input/Error
Поэтому и спрашиваю

Консоль нужна, да-да, но для чего - сам не знаю...
п....ц.
5 июн 18, 12:06    [21469239]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
defecator
Member

Откуда:
Сообщений: 38469
Мимопроходящий
05.06.2018 11:48, Dimitry Sibiryakov пишет:
> Главный вопрос: зачем?

он мыслит "окошками".
пишет супер-пупер "сёрвис".
но окошко у сёрвиса быть должно.
(по мнению аффтора)

в общем - клиника.

ты там давай, не спорь с величайшим программистом в истории !
он, наконец-то, занялся нормальными прикладными задачами, а не самым быстрым в мире лапшекодом !
не спугни !
5 июн 18, 12:11    [21469261]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
После создания консоли, я её настраиваю
Задаю размеры, область вывода, позиционирую в центр экрана, меняю Caption

Зайди с другой стороны: Windows помнит параметры консоли для каждого приложения
индивидуально. Выясни где она это хранит и задавай параметры консоли для совего приложения
перед её созданием.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 12:18    [21469292]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 6904
Dimitry Sibiryakov,

Ну в MSDN ф-ций для консоли: раз,два и все.

Вы же не предлагаете, системные структуры Windows ручками в 0 кольце защиты править ))).
5 июн 18, 12:27    [21469321]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

Leonid Kudryavtsev
Вы же не предлагаете, системные структуры Windows ручками в 0 кольце защиты править ))).

Они сохраняются между сеансами, так что вряд ли они в кольце 0. Реестр скорее всего.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 12:53    [21469416]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Мимопроходящий,

Ты не задавался вопросом, почему линуксовые сервисы имеют консольный вывод?
5 июн 18, 13:38    [21469582]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Я же объяснил, зачем мне эмулировать AllocConsole
Что не понятного?
5 июн 18, 13:39    [21469588]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
Ну так эмулируй, а не попрошайничай.
Тебе и код дали, и направление - что ещё за тебя сделать?
Не можешь головой работать - иди в армию.
5 июн 18, 13:46    [21469614]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
Ты не задавался вопросом, почему линуксовые сервисы имеют консольный вывод?

Ты не поверишь, но они вообще вывода не имеют. Канонический сниппет демонизации
перекидывает его в /dev/nul или просто закрывает.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 13:47    [21469617]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Так а я не попрошайничаю, а нормально спрашиваю. За код спасибо. Нечего добавить - ради бога. Только грубить не надо.
5 июн 18, 14:02    [21469659]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Dimitry Sibiryakov,

Почему же не поверю? Поверю. Только ситуации тоже разные бывают.
В отладке можно и в скринах запускать
Вывод в терминал есть. А как ты его используешь - дело программиста
5 июн 18, 14:14    [21469723]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
Только ситуации тоже разные бывают.
В отладке можно и в скринах запускать

Так это для отладки линуксовых демонов тебе нужна консоль точно посередине экрана?
Понятненько...

Posted via ActualForum NNTP Server 1.5

5 июн 18, 14:24    [21469755]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Dimitry Sibiryakov,

Почему линуксовых?
А в винде разве не надо сервисы отлаживать?
Да и под линуксами, почему, собственно нет
5 июн 18, 14:58    [21469890]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU
Dimitry Sibiryakov,

Почему линуксовых?
А в винде разве не надо сервисы отлаживать?
...

Интересно, с каким юзером ты собрался взаимодействовать, пытаясь создать консоль из сервиса? Ну, в какой пользовательской сессии будет доступна такая консоль?
Поясни, пожалуйста.
5 июн 18, 15:09    [21469935]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

А кто отлаживает сервис? Программист или тестер
5 июн 18, 15:16    [21469980]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU,

да, кто. Я это и спросил. В контексте какой сессии "сидит" программист, и в какой - сервис.
5 июн 18, 15:20    [21469999]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

В контексте своего рабочего места. Когда херачит код. Один херачит и смотрит, правильно ли оно работает. Второй получает сборку и тоже проверяет, правильно ли оно работает. :)
5 июн 18, 15:29    [21470029]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28960

окна...
всюду окна.
и в голове.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 15:35    [21470053]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
Что-то ты не очень представляешь, что есть служба виндовс.
5 июн 18, 15:35    [21470054]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Это ты не представляешь, что приложение может запускаться не только как сервис, но и в stand-alone режиме. Например, для отладки
5 июн 18, 15:37    [21470066]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
Ну так что ты тогда про сервисы талдычишь.
5 июн 18, 15:39    [21470074]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

По мне - это оптимальное название. Сервер или серверное приложение - не але. Служба - тем более. А сервис вроде как понятен. Не обязан быть ни сервером, ни службой. Но может быть как тем, так и этим
5 июн 18, 15:49    [21470124]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
Вообще, дичь полная.
Ну ладно, запуск "как приложения" для отладки, пусть с консолью.
Ну, сбилди отладочном приложение с флагом "консольное", вот тебе и консоль, что за бред с позиционированием окна...
И все равно, "как сервис" рано или поздно придется запускать - там уже гарантированно не будет ошибок, что ли? Так и будешь прыг-скок...
Напиши простейшего клиента для работы с сервисом, это же и просто и удобно, хоть локально сервис отлаживай, хоть удаленно, да и управлять/настраивать удобно.
5 июн 18, 15:53    [21470144]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28960

05.06.2018 15:49, SOFT FOR YOU пишет:
> Сервер или серверное приложение - не але. Служба - тем более. А сервис вроде как понятен. Не обязан быть ни сервером, ни службой. Но может быть как тем, так и этим

о! второе пришествие Дэйва Катлера...

Posted via ActualForum NNTP Server 1.5

5 июн 18, 15:53    [21470148]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Делает одно приложение. Которое знает, сервис ли оно или stand-alone. И работает соответственно. В Debug или Release сборке
5 июн 18, 16:16    [21470296]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
Которое знает, сервис ли оно или stand-alone.

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

Posted via ActualForum NNTP Server 1.5

5 июн 18, 16:22    [21470332]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

А уж какие забавные вещи позволяет творить имя файла лога типа \\.\pipe\MySuperLog -
вообще ни словами описать, ни в сказке рассказать.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 16:34    [21470421]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Dimitry Sibiryakov,

Я работаю в конторе, где 100+ сотрудников, и добрая половина из них программисты. Контора многие годы занимается тем, что разрабатывает промышленные сервера для линукс. И здесь используется как раз такая система, что пишутся логи и данные в терминал, в зависимости от уровня логирования. Поэтому будь добр, не рассказывай мне о том, что задолбаются делать тестеры.
5 июн 18, 16:41    [21470450]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28960

05.06.2018 16:41, SOFT FOR YOU пишет:
> пишутся логи и данные в терминал

вкуда?

Posted via ActualForum NNTP Server 1.5

5 июн 18, 16:45    [21470467]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
Контора многие годы занимается тем, что разрабатывает промышленные сервера для линукс. И
здесь используется как раз такая система, что пишутся логи и данные в терминал, в
зависимости от уровня логирования.

Не хочу тебя расстраивать, но, в отличии от линуха, виндовая консоль открывается в той
позиции и с тем размером которые ей установили в прошлый раз. Поэтому принудительно каждый
раз перетаскивать её в центр экрана совершенно не нужно.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 16:49    [21470490]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

https://blogs.msdn.microsoft.com/commandline/2017/06/20/understanding-windows-console-host-settings/

Posted via ActualForum NNTP Server 1.5

5 июн 18, 16:55    [21470520]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Dimitry Sibiryakov,

Я проверял, у меня не сохраняется
Может быть потому, что область вывода и размеры окна меняю
Может, что приложение изначально не консоль, а вызывается AllocConsole
5 июн 18, 17:05    [21470565]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
Может, что приложение изначально не консоль, а вызывается AllocConsole

А ты проверь: убери свои прыжки в ширину, измени параметры через диалог из системной
менюшки и посмотри где эта консоль откроется в следующий раз.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 17:14    [21470599]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU
Dimitry Sibiryakov,

Я проверял, у меня не сохраняется
Может быть потому, что область вывода и размеры окна меняю
Может, что приложение изначально не консоль, а вызывается AllocConsole


Может, и не сохраняется, кто знает, что там у тебя за код.
...
Сделай консольный лончер. Крошечное консольное приложение, которое будет стартовать твой сервис и завершаться.
А сервис уже будет использовать консоль лончера.
5 июн 18, 17:19    [21470621]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Dimitry Sibiryakov,

Да проверяли уже
Говорю же )
5 июн 18, 17:20    [21470628]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
Да проверяли уже
Говорю же )

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

Posted via ActualForum NNTP Server 1.5

5 июн 18, 17:55    [21470761]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Dimitry Sibiryakov,

А область вывода менял?
5 июн 18, 18:05    [21470789]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Может быть и правда я криво проверял
В любом случае я центрирую окно и хочу сделать это по красоте
Если к сообщению первого оратора есть что добавить - ради бога
5 июн 18, 18:07    [21470794]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

SOFT FOR YOU
А область вывода менял?

А твоя "область вывода" это, случайно так, не "Screen Buffer", которых может быть много?..
Они, сюрприз, в Windows существуют отдельно от консольного окна.

Posted via ActualForum NNTP Server 1.5

5 июн 18, 18:20    [21470828]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Зафигачил функцию, всё работает

procedure AllocInvisibleConsole;
var
  FileName: string;
  Buffer: array[0..MAX_PATH] of Char;
  StartupInfo: TStartUpInfo;
  ProcInfo: TProcessInformation;
  Handle: THandle;
  Coord: TCoord;
  Temp: Cardinal;
  Info: TConsoleScreenBufferInfo;
  Count: NativeUInt;
begin
  SetString(FileName, Buffer, GetSystemDirectory(Buffer, MAX_PATH - 1));
  FileName := IncludeTrailingPathDelimiter(FileName) + 'cmd.exe';

  FillChar(StartupInfo, SizeOf(TStartupInfo), #0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  if (FileExists(FileName)) and (CreateProcess(PChar(FileName), nil, nil, nil,
    True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcInfo)) then
  begin
    while (not AttachConsole(ProcInfo.dwProcessId)) do
      Sleep(10);

    TerminateProcess(ProcInfo.hProcess, Temp);
    SetConsoleTitle(PChar(ParamStr(0)));

    Handle := GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(Handle, Info);
    Count := NativeUInt(Info.dwSize.X) * NativeUInt(Info.dwSize.Y);
    FillChar(Coord, SizeOf(Coord), #0);
    FillConsoleOutputAttribute(Handle, Info.wAttributes, Count, Coord, Temp);
    FillConsoleOutputCharacter(Handle, #32, Count, Coord, Temp);
    FillChar(Coord, SizeOf(Coord), #0);
    SetConsoleCursorPosition(Handle, Coord);
  end else
  begin
    AllocConsole;
    ShowWindow(GetConsoleWindow, SW_HIDE);
  end;
end;


Вопрос. Это работает в Windows 10. В других виндах сюрпризов не будет? Меня смущает STD_OUTPUT_HANDLE/STD_INPUT_HANDLE
7 июн 18, 13:50    [21475947]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
defecator
Member

Откуда:
Сообщений: 38469
SOFT FOR YOU
Зафигачил функцию, всё работает

procedure AllocInvisibleConsole;
var
  FileName: string;
  Buffer: array[0..MAX_PATH] of Char;
  StartupInfo: TStartUpInfo;
  ProcInfo: TProcessInformation;
  Handle: THandle;
  Coord: TCoord;
  Temp: Cardinal;
  Info: TConsoleScreenBufferInfo;
  Count: NativeUInt;
begin
  SetString(FileName, Buffer, GetSystemDirectory(Buffer, MAX_PATH - 1));
  FileName := IncludeTrailingPathDelimiter(FileName) + 'cmd.exe';

  FillChar(StartupInfo, SizeOf(TStartupInfo), #0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  if (FileExists(FileName)) and (CreateProcess(PChar(FileName), nil, nil, nil,
    True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcInfo)) then
  begin
    while (not AttachConsole(ProcInfo.dwProcessId)) do
      Sleep(10);

    TerminateProcess(ProcInfo.hProcess, Temp);
    SetConsoleTitle(PChar(ParamStr(0)));

    Handle := GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(Handle, Info);
    Count := NativeUInt(Info.dwSize.X) * NativeUInt(Info.dwSize.Y);
    FillChar(Coord, SizeOf(Coord), #0);
    FillConsoleOutputAttribute(Handle, Info.wAttributes, Count, Coord, Temp);
    FillConsoleOutputCharacter(Handle, #32, Count, Coord, Temp);
    FillChar(Coord, SizeOf(Coord), #0);
    SetConsoleCursorPosition(Handle, Coord);
  end else
  begin
    AllocConsole;
    ShowWindow(GetConsoleWindow, SW_HIDE);
  end;
end;



Вопрос. Это работает в Windows 10. В других виндах сюрпризов не будет? Меня смущает STD_OUTPUT_HANDLE/STD_INPUT_HANDLE

поставь винду в виртуалку и проверь
7 июн 18, 13:52    [21475952]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
defecator,

Лень
7 июн 18, 13:54    [21475966]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
defecator
Member

Откуда:
Сообщений: 38469
SOFT FOR YOU
defecator,

Лень

молодец, чо
7 июн 18, 13:55    [21475975]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1851
defecator
молодец, чо
Да лана тебе! Ща все шустро набегут и будут дружно тестировать под разными осями
7 июн 18, 14:25    [21476107]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Стал тестировать на Windows иногда (при некоторых стартах) возникает ошибка System Error. Code 6. Неверный дескриптор
Может на Windows X тоже бывает ошибка, но повторить не успел

Ошибка возникает здесь:
Win32Check(WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), AText, ATextLength, DWORD(nil^), nil));


Причём в обоих случаях, как в рабочем случае, так и в нерабочем, GetStdHandle(STD_OUTPUT_HANDLE) возвращает 7
У кого какие идеи, как это можно исправить?

Возникает ощущение, что STD_OUTPUT_HANDLE не успевает приаттачиться к консоли
С другой стороны все функции типа GetConsoleScreenBufferInfo/SetConsoleCursorPosition/GetLargestConsoleWindowSize - отрабатывают корректно
7 июн 18, 22:24    [21477528]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
defecator
Member

Откуда:
Сообщений: 38469
SOFT FOR YOU
Стал тестировать на Windows иногда (при некоторых стартах) возникает ошибка System Error. Code 6. Неверный дескриптор
Может на Windows X тоже бывает ошибка, но повторить не успел

Ошибка возникает здесь:
Win32Check(WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), AText, ATextLength, DWORD(nil^), nil));



Причём в обоих случаях, как в рабочем случае, так и в нерабочем, GetStdHandle(STD_OUTPUT_HANDLE) возвращает 7
У кого какие идеи, как это можно исправить?

Возникает ощущение, что STD_OUTPUT_HANDLE не успевает приаттачиться к консоли
С другой стороны все функции типа GetConsoleScreenBufferInfo/SetConsoleCursorPosition/GetLargestConsoleWindowSize - отрабатывают корректно

величайшего оптимизатора опустили с небес ?
https://docs.microsoft.com/en-us/windows/console/getstdhandle
7 июн 18, 22:33    [21477543]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
defecator,

Выдели жирным, на что ты хочешь обратить моё мнимание
7 июн 18, 22:53    [21477572]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU
Зафигачил функцию, всё работает

procedure AllocInvisibleConsole;
var
  FileName: string;
  Buffer: array[0..MAX_PATH] of Char;
  StartupInfo: TStartUpInfo;
  ProcInfo: TProcessInformation;
  Handle: THandle;
  Coord: TCoord;
  Temp: Cardinal;
  Info: TConsoleScreenBufferInfo;
  Count: NativeUInt;
begin
  SetString(FileName, Buffer, GetSystemDirectory(Buffer, MAX_PATH - 1));
  FileName := IncludeTrailingPathDelimiter(FileName) + 'cmd.exe';

  FillChar(StartupInfo, SizeOf(TStartupInfo), #0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  if (FileExists(FileName)) and (CreateProcess(PChar(FileName), nil, nil, nil,
    True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcInfo)) then
  begin
    while (not AttachConsole(ProcInfo.dwProcessId)) do
      Sleep(10);

    TerminateProcess(ProcInfo.hProcess, Temp);
    SetConsoleTitle(PChar(ParamStr(0)));

    Handle := GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(Handle, Info);
    Count := NativeUInt(Info.dwSize.X) * NativeUInt(Info.dwSize.Y);
    FillChar(Coord, SizeOf(Coord), #0);
    FillConsoleOutputAttribute(Handle, Info.wAttributes, Count, Coord, Temp);
    FillConsoleOutputCharacter(Handle, #32, Count, Coord, Temp);
    FillChar(Coord, SizeOf(Coord), #0);
    SetConsoleCursorPosition(Handle, Coord);
  end else
  begin
    AllocConsole;
    ShowWindow(GetConsoleWindow, SW_HIDE);
  end;
end;
...

То есть, ты все же не удержался и спотимизировал:

чччД__
SOFT FOR YOU,

Ну, например....
    while not AttachConsole(ProcInfo.dwProcessId) do
      sleep(50);
...


Ну, страдай теперь.
7 июн 18, 23:03    [21477597]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

У меня в этом (соседнем) проекте была похожая штука. Ребята сначала меняли Caption консоли на тот, где указан PID, потом ждали 100 мск, потом делали FindWindow и находили окно. Так вот эта штука работала в 80% случаев, а в 20% выдавала Exception-ы, по крайней мере на моей машине. Потом я нашёл функцию GetConsoleWindow и теперь успешно её применяю.

К чему это я. Что Sleep(50) по сути своей ничего не гарантирует. А я хочу сделать по уму.
7 июн 18, 23:08    [21477609]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU
...А я хочу сделать по уму.

Это правильно, но движения что-то не видно.
...
Ты всего лишь должен не тупо пытаться вызывать AttachConsole(ProcInfo.dwProcessId), а предварительно убедиться в том, что ProcInfo.dwProcessId достаточно валиден, чтобы его использовать.
7 июн 18, 23:16    [21477628]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Если CreateProcess вернул True - то ProcInfo.dwProcessId валиден
7 июн 18, 23:18    [21477634]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU
чччД__,

Если CreateProcess вернул True - то ProcInfo.dwProcessId валиден


Ну что же, тряси дальше.
7 июн 18, 23:19    [21477638]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Удивительно

Вот такой обрабатывается нормально:
    while (not AttachConsole(ProcInfo.dwProcessId)) do
      Sleep(10);

    Buffer[0] := #0;
    while (not WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), @Buffer, 1, Cardinal(nil^), 0)) do
    begin
      Inc(COUNTER);
      Sleep(50);
    end;
    COUNTER := COUNTER;


А если сделать Sleep(1) - то второй цикл становится бесконечным
Ну и как это решить?
Увеличить Sleep не предлагать. Должно быть какое-то здоровое решение
7 июн 18, 23:41    [21477682]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU,

CreateProcess function

Как бы толстый намёк
The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process.

Только учти, что WaitForInputIdle применительно к cmd.exe приложения тебе не поможет:
Ибо
...If this process is a console application or does not have a message queue, WaitForInputIdle returns immediately...

Ибо приложение cmd.exe не использует очередь сообщений.
8 июн 18, 00:02    [21477723]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
очень умиляет Cardinal(nil^), и ведь осознанно написал! полную, несуразную дичь


COUNTER = COUNTER ? Картинка с другого сайта. не совсем понял, зачем пытаться втолкнуть то, что не вталкивается ? нужно же, запросить ошибку, и сделать дело отталкиваясь от нее
8 июн 18, 00:02    [21477726]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
Как же ты раньше оптимизациями занимался? Запускал проги на чистом железе, без операционки?
8 июн 18, 00:04    [21477728]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

А зачем ты мне про WaitForInputIdle рассказываешь, если для cmd он не сработает?
И причём тут оптимизации?

Кукареку,

Ты слишком мал
Проспись
8 июн 18, 00:12    [21477734]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU
чччД__,

А зачем ты мне про WaitForInputIdle рассказываешь, если для cmd он не сработает?
...

Что ж ты такой прямолинейный.

Я тебе рассказывал о том, во-первых, поиск окон процесса, на которое, как ты сказал, ты жаловался где-то в соседнем топике, следует выполнять лишь после того, как процесс инициализируется, и, во-вторых, что успешное выполнение CreateProcess() вовсе не означает, что хэндл и id процесса сразу же готовы к использованию.
8 июн 18, 00:19    [21477742]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45432

чччД__
успешное выполнение CreateProcess() вовсе не означает, что хэндл и id процесса сразу же
готовы к использованию.

Они-то готовы, но он же их не в ту дырку суёт.

Posted via ActualForum NNTP Server 1.5

8 июн 18, 00:26    [21477748]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукарку
Guest
SOFT FOR YOU
Ты слишком мал
Проспись

ты программировать не умеешь, судя по ошибке и ответу. Серьёзно!

ты у nil берешь нижнюю ступень, ступенью будет служить ближайший регистр, который впихнет компилятор. это может быть любая переменная, загруженная в EAX,ECX,EDX и.т.д. в плодь до стэка

большое счастье что ты еще ошибок не поймал, на таком чуде коде - ужаса, ночного кошмара, когда ты нарочно портишь чужую память.

пока писал, решил все просмотреть внимательно в теме, и увидел что ты уже был поимет своей тупой выходкой в сообщение 21477528
8 июн 18, 00:46    [21477761]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
накатал пример

К сообщению приложен файл. Размер - 24Kb
8 июн 18, 00:50    [21477765]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,
Dimitry Sibiryakov,

Да, да, я плохой - это понятно. Делать то чё?
8 июн 18, 02:10    [21477780]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Кукареку,

А тебя не наталкивает на какую-то мысль, что ты при таком раскладе ловишь AV, а я нет? ;)
8 июн 18, 02:11    [21477781]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
Dimitry Sibiryakov
SOFT FOR YOU
После создания консоли, я её настраиваю
Задаю размеры, область вывода, позиционирую в центр экрана, меняю Caption

Зайди с другой стороны: Windows помнит параметры консоли для каждого приложения
индивидуально. Выясни где она это хранит и задавай параметры консоли для совего приложения
перед её созданием.


2 SOFT FOR YOU: завершая приложение, сохраняй текущее положение консоли, и все.
Точнее - перед убиением консоли.

uses
..., Windows, Registry;

function GetConsoleWindow: HWND; stdcall; external kernel32 name 'GetConsoleWindow';
function SaveCurrConsolePosition(): Boolean;
var
  fCW: HWND;
  flpR: TRect;
  fReg: TRegistry;
  fSubKey: string;
  fPos: COORD;
begin
  result := False;
  fCW := GetConsoleWindow();
  if fCW = 0 then
    Exit;

  fReg := TRegistry.Create;
  try
    fSubKey := GetModuleName(HInstance);
    fSubKey := StringReplace(fSubKey, '\', '_', [rfReplaceAll]);

    if fReg.OpenKey('Console\' + fSubKey, True) then begin 

      GetWindowRect(fCW, flpR);
      fPos.X := flpR.Left;
      fPos.Y := flpR.Top;

      fReg.WriteBinaryData('WindowPosition', fPos, SizeOf(COORD));
    end;
    result := true;
  finally
    fReg.Free;
  end;
end;


Подумай все же о военной службе.
8 июн 18, 04:22    [21477798]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Нет спасибо )
Я лучше буду делать Sleep(100) или разберусь с AttachConsole
Чем задавать позицию окна через реестр при завершении приложения
8 июн 18, 07:16    [21477838]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
SOFT FOR YOU
чччД__,

Нет спасибо )
Я лучше буду делать Sleep(100) или разберусь с AttachConsole
Чем задавать позицию окна через реестр при завершении приложения

Ты же не разберешься, так и будешь позорно sleep() вызывать.

А предложенный способ - вполне себе штатный и даже рекомендованный Microsoft.
Более того, сей способ "по умолчанию" реализован многими системами программирования при построении консольных приложений.
8 июн 18, 07:38    [21477853]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
чччД__,

Посмотрим
8 июн 18, 08:07    [21477872]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
SOFT FOR YOU,

- Если что - то работает, это не значит, что оно работает - именно так, как ты хочешь (С)

ошибка происходит на строке
t := Cardinal(nil^);


потому в консольном приложение eax будет пустым, и не от куда будет взять нижнюю ступень - AV

проверяй
+
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

var
  t: Cardinal;

begin
  try
    t := Cardinal(nil^);
    Writeln(t);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

  Readln;

end.
8 июн 18, 09:18    [21478000]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
руки дошли сделать поиск в кодах среды.
8 июн 18, 09:50    [21478096]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
руки дошли сделать поиск в кодах среды.

К сообщению приложен файл. Размер - 57Kb
8 июн 18, 09:51    [21478098]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
kloun02
Member

Откуда:
Сообщений: 7132
Кукареку,

var параметр, учи матчасть.
8 июн 18, 10:18    [21478186]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
kloun02,

Спасибо КЭП! Куда мы без тебя. Весь мир пойдет по трантарары


речь шла о том, что "SOFT FOR YOU" делал такую дичь
t := Cardinal(nil^);



Что же ты ему не кинулся ошибку ЕГО то показывать? за то решил показать свой тугенький ум на мне )))
8 июн 18, 10:59    [21478351]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
kloun02
Member

Откуда:
Сообщений: 7132
Кукареку
kloun02,

Спасибо КЭП! Куда мы без тебя. Весь мир пойдет по трантарары


речь шла о том, что "SOFT FOR YOU" делал такую дичь
t := Cardinal(nil^);




Что же ты ему не кинулся ошибку ЕГО то показывать? за то решил показать свой тугенький ум на мне )))
Нет, эту дичь делал ты, исключительно. В коде мегаотца все было в пределах нормы.
8 июн 18, 11:23    [21478422]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 6904
чччД__
CreateProcess function

Как бы толстый намёк
The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process.

Только учти, что WaitForInputIdle применительно к cmd.exe приложения тебе не поможет:
Ибо
...If this process is a console application or does not have a message queue, WaitForInputIdle returns immediately...

Ибо приложение cmd.exe не использует очередь сообщений.

Для console application мы же вполне может ридерект StdInput, StdOutput использовать.
Нельзя ли как-то к ним привязаться? Например, cmd.exe ждет ввода в StdInput, значит проинициализировалась.

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

Алоцировать консоль, что бы туда что-то выводить.... Мне не очень понятно. А особенно, с такими мучениями и "кривостями" как воровство чужой консоли (((
8 июн 18, 11:38    [21478503]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
kloun02
Нет, эту дичь делал ты, исключительно. В коде мегаотца все было в пределах нормы.


Ты просто слепой - как котенок, который появился только что на свет. Защищаешь его, думая что он властелин кода - говно кода

Вот его сообщения, где он делал эту дичь
+
SOFT FOR YOU
Стал тестировать на Windows иногда (при некоторых стартах) возникает ошибка System Error. Code 6. Неверный дескриптор
Может на Windows X тоже бывает ошибка, но повторить не успел

Ошибка возникает здесь:
Win32Check(WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), AText, ATextLength,  DWORD(nil^) , nil));


Причём в обоих случаях, как в рабочем случае, так и в нерабочем, GetStdHandle(STD_OUTPUT_HANDLE) возвращает 7
У кого какие идеи, как это можно исправить?

Возникает ощущение, что STD_OUTPUT_HANDLE не успевает приаттачиться к консоли
С другой стороны все функции типа GetConsoleScreenBufferInfo/SetConsoleCursorPosition/GetLargestConsoleWindowSize - отрабатывают корректно


SOFT FOR YOU
Удивительно

Вот такой обрабатывается нормально:
    while (not AttachConsole(ProcInfo.dwProcessId)) do
      Sleep(10);

    Buffer[0] := #0;
    while (not WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), @Buffer, 1,  Cardinal(nil^) , 0)) do
    begin
      Inc(COUNTER);
      Sleep(50);
    end;
    COUNTER := COUNTER;


А если сделать Sleep(1) - то второй цикл становится бесконечным
Ну и как это решить?
Увеличить Sleep не предлагать. Должно быть какое-то здоровое решение


и если после этого ты продолжишь гнуть свою палку, то ты просто его попа лиз
8 июн 18, 11:49    [21478559]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
Я бы такого работника SOFT FOR YOU , сразу уволил после такого кода

К сообщению приложен файл. Размер - 31Kb
8 июн 18, 11:54    [21478572]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
kloun02
Member

Откуда:
Сообщений: 7132
Кукареку
Вот его сообщения, где он делал эту дичь

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

Тебе бы вместо разбрасывания соплей по форуму, взять бы да попробовать скомпилить его код.
8 июн 18, 11:56    [21478584]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
И вот, что бы сразу все вопросы отпали. Типа - мол есть какая то проверка на nil указатель (от куда бы ему взяться ? И все равно бы не помогло)

К сообщению приложен файл. Размер - 31Kb
8 июн 18, 11:57    [21478591]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Кукареку
Guest
kloun02,

Все. Ты его попа лиз. Официально заявлено и подтверждено!
8 июн 18, 11:58    [21478599]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
kloun02
Member

Откуда:
Сообщений: 7132
Кукареку
kloun02,

Все. Ты его попа лиз. Официально заявлено и подтверждено!
Болезный на вот тебе
procedure Test(var i: Cardinal);
begin
  if @i <> nil then
    i := 3465;
end;
8 июн 18, 12:04    [21478638]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Кукареку,

Ты заколебал


Leonid Kudryavtsev,

Я не против других решений
Задача - аллоцировать невидимую консоль


All,

Можно почитать и вдохновиться. Я пока повременю :)

+
BOOL WINAPI AllocConsole(void)
{
    HANDLE      handle_in = INVALID_HANDLE_VALUE;
    HANDLE      handle_out = INVALID_HANDLE_VALUE;
    HANDLE      handle_err = INVALID_HANDLE_VALUE;
    STARTUPINFOA        siCurrent;
    STARTUPINFOA    siConsole;
    char                buffer[1024];

    TRACE("()\n");

    handle_in = OpenConsoleW( coninW, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
                              FALSE, OPEN_EXISTING );

    if (VerifyConsoleIoHandle(handle_in))
    {
    /* we already have a console opened on this process, don't create a new one */
    CloseHandle(handle_in);
    return FALSE;
    }

    /* invalidate local copy of input event handle */
    console_wait_event = 0;

    GetStartupInfoA(&siCurrent);

    memset(&siConsole, 0, sizeof(siConsole));
    siConsole.cb = sizeof(siConsole);
    /* setup a view arguments for wineconsole (it'll use them as default values)  */
    if (siCurrent.dwFlags & STARTF_USECOUNTCHARS)
    {
        siConsole.dwFlags |= STARTF_USECOUNTCHARS;
        siConsole.dwXCountChars = siCurrent.dwXCountChars;
        siConsole.dwYCountChars = siCurrent.dwYCountChars;
    }
    if (siCurrent.dwFlags & STARTF_USEFILLATTRIBUTE)
    {
        siConsole.dwFlags |= STARTF_USEFILLATTRIBUTE;
        siConsole.dwFillAttribute = siCurrent.dwFillAttribute;
    }
    if (siCurrent.dwFlags & STARTF_USESHOWWINDOW)
    {
        siConsole.dwFlags |= STARTF_USESHOWWINDOW;
        siConsole.wShowWindow = siCurrent.wShowWindow;
    }
    /* FIXME (should pass the unicode form) */
    if (siCurrent.lpTitle)
        siConsole.lpTitle = siCurrent.lpTitle;
    else if (GetModuleFileNameA(0, buffer, sizeof(buffer)))
    {
        buffer[sizeof(buffer) - 1] = '\0';
        siConsole.lpTitle = buffer;
    }

    if (!start_console_renderer(&siConsole))
    goto the_end;

    if( !(siCurrent.dwFlags & STARTF_USESTDHANDLES) ) {
        /* all std I/O handles are inheritable by default */
        handle_in = OpenConsoleW( coninW, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
                                  TRUE, OPEN_EXISTING );
        if (handle_in == INVALID_HANDLE_VALUE) goto the_end;
  
        handle_out = OpenConsoleW( conoutW, GENERIC_READ|GENERIC_WRITE,
                                   TRUE, OPEN_EXISTING );
        if (handle_out == INVALID_HANDLE_VALUE) goto the_end;
  
        if (!DuplicateHandle(GetCurrentProcess(), handle_out, GetCurrentProcess(),
                    &handle_err, 0, TRUE, DUPLICATE_SAME_ACCESS))
            goto the_end;
    } else {
        /*  STARTF_USESTDHANDLES flag: use handles from StartupInfo */
        handle_in  =  siCurrent.hStdInput;
        handle_out =  siCurrent.hStdOutput;
        handle_err =  siCurrent.hStdError;
    }

    /* NT resets the STD_*_HANDLEs on console alloc */
    SetStdHandle(STD_INPUT_HANDLE,  handle_in);
    SetStdHandle(STD_OUTPUT_HANDLE, handle_out);
    SetStdHandle(STD_ERROR_HANDLE,  handle_err);

    SetLastError(ERROR_SUCCESS);

    return TRUE;

 the_end:
    ERR("Can't allocate console\n");
    if (handle_in != INVALID_HANDLE_VALUE)  CloseHandle(handle_in);
    if (handle_out != INVALID_HANDLE_VALUE) CloseHandle(handle_out);
    if (handle_err != INVALID_HANDLE_VALUE) CloseHandle(handle_err);
    FreeConsole();
    return FALSE;
}

static  BOOL    start_console_renderer_helper(const char* appname, STARTUPINFOA* si,
                                              HANDLE hEvent)
{
    char        buffer[1024];
    int                 ret;
    PROCESS_INFORMATION pi;

    /* FIXME: use dynamic allocation for most of the buffers below */
    ret = snprintf(buffer, sizeof(buffer), "%s --use-event=%ld", appname, (DWORD_PTR)hEvent);
    if ((ret > -1) && (ret < sizeof(buffer)) &&
        CreateProcessA(NULL, buffer, NULL, NULL, TRUE, DETACHED_PROCESS,
                       NULL, NULL, si, &pi))
    {
        HANDLE  wh[2];
        DWORD   res;

        wh[0] = hEvent;
        wh[1] = pi.hProcess;
        res = WaitForMultipleObjects(2, wh, FALSE, INFINITE);

        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);

        if (res != WAIT_OBJECT_0) return FALSE;

        TRACE("Started wineconsole pid=%08x tid=%08x\n",
              pi.dwProcessId, pi.dwThreadId);

        return TRUE;
    }
    return FALSE;
}

static  BOOL    start_console_renderer(STARTUPINFOA* si)
{
    HANDLE      hEvent = 0;
    LPSTR       p;
    OBJECT_ATTRIBUTES   attr;
    BOOL                ret = FALSE;

    attr.Length                   = sizeof(attr);
    attr.RootDirectory            = 0;
    attr.Attributes               = OBJ_INHERIT;
    attr.ObjectName               = NULL;
    attr.SecurityDescriptor       = NULL;
    attr.SecurityQualityOfService = NULL;

    NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &attr, NotificationEvent, FALSE);
    if (!hEvent) return FALSE;

    /* first try environment variable */
    if ((p = getenv("WINECONSOLE")) != NULL)
    {
        ret = start_console_renderer_helper(p, si, hEvent);
        if (!ret)
            ERR("Couldn't launch Wine console from WINECONSOLE env var (%s)... "
                "trying default access\n", p);
    }

    /* then try the regular PATH */
    if (!ret)
        ret = start_console_renderer_helper("wineconsole", si, hEvent);

    CloseHandle(hEvent);
    return ret;
}
8 июн 18, 12:22    [21478690]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
kloun02
Member

Откуда:
Сообщений: 7132
Кукареку,

жду официальных опровержений
8 июн 18, 12:44    [21478784]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10450
SOFT FOR YOU
А тебя не наталкивает на какую-то мысль, что ты при таком раскладе ловишь AV, а я нет? ;)
Справедливости ради
lpNumberOfCharsWritten [out]
A pointer to a variable that receives the number of characters actually written.
Про optional ничего нет, хотя MS обычно о таких вещах пишет
8 июн 18, 12:51    [21478824]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
чччД__
Guest
Leonid Kudryavtsev
...Лично я, в свое время, наоборот рисовал свое окошко и направлял туда вывод консольных приложений, что бы выглядело более-менее "прилично" и вывод внешнего приложения не выпадал из дизайна.
...

+1
8 июн 18, 15:47    [21479551]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Василий 2
Member

Откуда:
Сообщений: 149
Передача (nil)^ в var-параметр - хоть и смахивает на хак, но работает корректно. Компилятор не вычисляет это выражение, а сразу пишет 0:
procedure Test(a: Byte; var i: Byte);
begin

end;

Test(10, PByte(nil)^);

RTDecoder.dpr.17: Test(10, PByte(nil)^);
00747588 33D2             xor edx,edx
0074758A B00A             mov al,$0a
0074758C E88F49FFFF       call Test

НО! Это подходит только для необязательных var параметров (те, которые предварительно проверяются как указатели - через @param для функций Delphi или объявлены указателями для импортированных функций). Как только функция попытается использовать значение параметра - случится бадабум.
15 июн 18, 11:28    [21493209]     Ответить | Цитировать Сообщить модератору
 Re: CreateProcess-аналог AllocConsole  [new]
Василий 2
Member

Откуда:
Сообщений: 149
Василий 2
НО! Это подходит только для необязательных var параметров (те, которые предварительно проверяются как указатели - через @param для функций Delphi или объявлены указателями для импортированных функций). Как только функция попытается использовать значение параметра - случится бадабум.

...или те, которые не используются при некоторых условиях. Например, вот такая конструкция также будет работать: Move(Src, (nil)^, 0);
15 июн 18, 11:30    [21493216]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / Delphi Ответить