powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CreateProcess-аналог AllocConsole
95 сообщений из 95, показаны все 4 страниц
CreateProcess-аналог AllocConsole
    #39655294
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно создать временно невидимую консоль, а в случае AllocConsole + ShowWindow она всё равно успевает мелькнуть
В интернете прочёл, что можно вручную создать консоль в режиме временно невидимого окна
Но найденные куски кода пока к успеху не привели, CreateProcess возвращает False

Подскажите, какие параметры должны быть, чтобы повторить AllocConsole
Желательно куски кода
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655299
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,

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

В startUpInfo задай:

Код: pascal
1.
2.
startUpInfo.wShowWindow := SW_HIDE;
startUpInfo.dwFlags := STARTF_USESHOWWINDOW;


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

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



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


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

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


Все.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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;
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655359
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Спасибо
А StdOut чего не заполняешь?
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655440
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, ну ты уж сам там доделай.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655446
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем на скрытой консоли?
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655457
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНужно создать временно невидимую консоль

Главный вопрос: зачем? Второстепенный вопрос: при чём тут CreateProcess?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655467
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Ну я как раз не понимаю, что делать с StdOut/Input/Error
Поэтому и спрашиваю
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655471
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator,

После создания консоли, я её настраиваю
Задаю размеры, область вывода, позиционирую в центр экрана, меняю Caption
Если создавать сразу видимую - то она неприятно моргает
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655479
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.06.2018 11:48, Dimitry Sibiryakov пишет:
> Главный вопрос: зачем?

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

в общем - клиника.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655480
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUчччД__,

Ну я как раз не понимаю, что делать с StdOut/Input/Error
Поэтому и спрашиваю
Консоль нужна, да-да, но для чего - сам не знаю...
п....ц.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655484
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Мимопроходящий05.06.2018 11:48, Dimitry Sibiryakov пишет:
> Главный вопрос: зачем?

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

в общем - клиника.
ты там давай, не спорь с величайшим программистом в истории !
он, наконец-то, занялся нормальными прикладными задачами, а не самым быстрым в мире лапшекодом !
не спугни !
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655489
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПосле создания консоли, я её настраиваю
Задаю размеры, область вывода, позиционирую в центр экрана, меняю Caption

Зайди с другой стороны: Windows помнит параметры консоли для каждого приложения
индивидуально. Выясни где она это хранит и задавай параметры консоли для совего приложения
перед её созданием.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655497
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

Вы же не предлагаете, системные структуры Windows ручками в 0 кольце защиты править ))).
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655524
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВы же не предлагаете, системные структуры Windows ручками в 0 кольце защиты править ))).

Они сохраняются между сеансами, так что вряд ли они в кольце 0. Реестр скорее всего.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655564
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Ты не задавался вопросом, почему линуксовые сервисы имеют консольный вывод?
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655567
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Я же объяснил, зачем мне эмулировать AllocConsole
Что не понятного?
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655573
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну так эмулируй, а не попрошайничай.
Тебе и код дали, и направление - что ещё за тебя сделать?
Не можешь головой работать - иди в армию.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655574
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТы не задавался вопросом, почему линуксовые сервисы имеют консольный вывод?

Ты не поверишь, но они вообще вывода не имеют. Канонический сниппет демонизации
перекидывает его в /dev/nul или просто закрывает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655584
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Так а я не попрошайничаю, а нормально спрашиваю. За код спасибо. Нечего добавить - ради бога. Только грубить не надо.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655605
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Почему же не поверю? Поверю. Только ситуации тоже разные бывают.
В отладке можно и в скринах запускать
Вывод в терминал есть. А как ты его используешь - дело программиста
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655617
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТолько ситуации тоже разные бывают.
В отладке можно и в скринах запускать

Так это для отладки линуксовых демонов тебе нужна консоль точно посередине экрана?
Понятненько...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655655
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Почему линуксовых?
А в винде разве не надо сервисы отлаживать?
Да и под линуксами, почему, собственно нет
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655664
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUDimitry Sibiryakov,

Почему линуксовых?
А в винде разве не надо сервисы отлаживать?
...
Интересно, с каким юзером ты собрался взаимодействовать, пытаясь создать консоль из сервиса? Ну, в какой пользовательской сессии будет доступна такая консоль?
Поясни, пожалуйста.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655668
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

А кто отлаживает сервис? Программист или тестер
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655671
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,

да, кто. Я это и спросил. В контексте какой сессии "сидит" программист, и в какой - сервис.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655678
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

В контексте своего рабочего места. Когда херачит код. Один херачит и смотрит, правильно ли оно работает. Второй получает сборку и тоже проверяет, правильно ли оно работает. :)
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655682
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
окна...
всюду окна.
и в голове.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655683
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то ты не очень представляешь, что есть служба виндовс.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655686
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Это ты не представляешь, что приложение может запускаться не только как сервис, но и в stand-alone режиме. Например, для отладки
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655688
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну так что ты тогда про сервисы талдычишь.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655702
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

По мне - это оптимальное название. Сервер или серверное приложение - не але. Служба - тем более. А сервис вроде как понятен. Не обязан быть ни сервером, ни службой. Но может быть как тем, так и этим
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655706
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще, дичь полная.
Ну ладно, запуск "как приложения" для отладки, пусть с консолью.
Ну, сбилди отладочном приложение с флагом "консольное", вот тебе и консоль, что за бред с позиционированием окна...
И все равно, "как сервис" рано или поздно придется запускать - там уже гарантированно не будет ошибок, что ли? Так и будешь прыг-скок...
Напиши простейшего клиента для работы с сервисом, это же и просто и удобно, хоть локально сервис отлаживай, хоть удаленно, да и управлять/настраивать удобно.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655708
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.06.2018 15:49, SOFT FOR YOU пишет:
> Сервер или серверное приложение - не але. Служба - тем более. А сервис вроде как понятен. Не обязан быть ни сервером, ни службой. Но может быть как тем, так и этим

о! второе пришествие Дэйва Катлера...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655739
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Делает одно приложение. Которое знает, сервис ли оно или stand-alone. И работает соответственно. В Debug или Release сборке
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655752
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКоторое знает, сервис ли оно или stand-alone.

Когда твои тестеры задолбаются читать бегущую консоль, они тебя начнут бить пока ты не
сделаешь-таки вывод лога в файл, который удобно читать, грепать и отсылать по почтк. Так
что ты сэкономишь себе время, занявшись этим уже сейчас.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655768
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А уж какие забавные вещи позволяет творить имя файла лога типа \\.\pipe\MySuperLog -
вообще ни словами описать, ни в сказке рассказать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655775
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Я работаю в конторе, где 100+ сотрудников, и добрая половина из них программисты. Контора многие годы занимается тем, что разрабатывает промышленные сервера для линукс. И здесь используется как раз такая система, что пишутся логи и данные в терминал, в зависимости от уровня логирования. Поэтому будь добр, не рассказывай мне о том, что задолбаются делать тестеры.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655779
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.06.2018 16:41, SOFT FOR YOU пишет:
> пишутся логи и данные в терминал

вкуда?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655789
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКонтора многие годы занимается тем, что разрабатывает промышленные сервера для линукс. И
здесь используется как раз такая система, что пишутся логи и данные в терминал, в
зависимости от уровня логирования.

Не хочу тебя расстраивать, но, в отличии от линуха, виндовая консоль открывается в той
позиции и с тем размером которые ей установили в прошлый раз. Поэтому принудительно каждый
раз перетаскивать её в центр экрана совершенно не нужно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655798
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655809
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Я проверял, у меня не сохраняется
Может быть потому, что область вывода и размеры окна меняю
Может, что приложение изначально не консоль, а вызывается AllocConsole
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655820
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUМожет, что приложение изначально не консоль, а вызывается AllocConsole

А ты проверь: убери свои прыжки в ширину, измени параметры через диалог из системной
менюшки и посмотри где эта консоль откроется в следующий раз.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655827
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUDimitry Sibiryakov,

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

Может, и не сохраняется, кто знает, что там у тебя за код.
...
Сделай консольный лончер. Крошечное консольное приложение, которое будет стартовать твой сервис и завершаться.
А сервис уже будет использовать консоль лончера.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655828
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Да проверяли уже
Говорю же )
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655870
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUДа проверяли уже
Говорю же )

Ну значит руки рихтуйте, проверяльщики, ибо у меня AllocConsole() в тестовом приложении,
сляпанном за пару минут, показывает консоль точно на том месте, которое я ей задал в
конфигурации. Ссылка, приведённая мною выше, не врёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655878
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

А область вывода менял?
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655881
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть и правда я криво проверял
В любом случае я центрирую окно и хочу сделать это по красоте
Если к сообщению первого оратора есть что добавить - ради бога
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39655893
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА область вывода менял?

А твоя "область вывода" это, случайно так, не "Screen Buffer", которых может быть много?..
Они, сюрприз, в Windows существуют отдельно от консольного окна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657357
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зафигачил функцию, всё работает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
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
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657361
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUЗафигачил функцию, всё работает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
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
поставь винду в виртуалку и проверь
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657365
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Лень
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657369
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Лень
молодец, чо
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657408
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorмолодец, чо Да лана тебе! Ща все шустро набегут и будут дружно тестировать под разными осями
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657939
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стал тестировать на Windows иногда (при некоторых стартах) возникает ошибка System Error. Code 6. Неверный дескриптор
Может на Windows X тоже бывает ошибка, но повторить не успел

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



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

Возникает ощущение, что STD_OUTPUT_HANDLE не успевает приаттачиться к консоли
С другой стороны все функции типа GetConsoleScreenBufferInfo/SetConsoleCursorPosition/GetLargestConsoleWindowSize - отрабатывают корректно
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657944
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUСтал тестировать на Windows иногда (при некоторых стартах) возникает ошибка System Error. Code 6. Неверный дескриптор
Может на Windows X тоже бывает ошибка, но повторить не успел

Ошибка возникает здесь:
Код: pascal
1.
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
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657951
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Выдели жирным, на что ты хочешь обратить моё мнимание
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657959
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUЗафигачил функцию, всё работает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
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,

Ну, например....
Код: pascal
1.
2.
    while not AttachConsole(ProcInfo.dwProcessId) do
      sleep(50);

...

Ну, страдай теперь.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657962
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

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

К чему это я. Что Sleep(50) по сути своей ничего не гарантирует. А я хочу сделать по уму.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657966
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU...А я хочу сделать по уму.
Это правильно, но движения что-то не видно.
...
Ты всего лишь должен не тупо пытаться вызывать AttachConsole(ProcInfo.dwProcessId), а предварительно убедиться в том, что ProcInfo.dwProcessId достаточно валиден, чтобы его использовать.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657969
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Если CreateProcess вернул True - то ProcInfo.dwProcessId валиден
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657970
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUчччД__,

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

Ну что же, тряси дальше.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657979
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удивительно

Вот такой обрабатывается нормально:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    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 не предлагать. Должно быть какое-то здоровое решение
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657988
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 не использует очередь сообщений.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657990
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
очень умиляет Cardinal(nil^), и ведь осознанно написал! полную, несуразную дичь


COUNTER = COUNTER ?
не совсем понял, зачем пытаться втолкнуть то, что не вталкивается ? нужно же, запросить ошибку, и сделать дело отталкиваясь от нее
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657991
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как же ты раньше оптимизациями занимался? Запускал проги на чистом железе, без операционки?
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657993
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

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

Кукареку,

Ты слишком мал
Проспись
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39657998
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUчччД__,

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

Я тебе рассказывал о том, во-первых, поиск окон процесса, на которое, как ты сказал, ты жаловался где-то в соседнем топике, следует выполнять лишь после того, как процесс инициализируется, и, во-вторых, что успешное выполнение CreateProcess() вовсе не означает, что хэндл и id процесса сразу же готовы к использованию.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658002
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__успешное выполнение CreateProcess() вовсе не означает, что хэндл и id процесса сразу же
готовы к использованию.

Они-то готовы, но он же их не в ту дырку суёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658010
Кукарку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUТы слишком мал
Проспись
ты программировать не умеешь, судя по ошибке и ответу. Серьёзно!

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

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

пока писал, решил все просмотреть внимательно в теме, и увидел что ты уже был поимет своей тупой выходкой в сообщение 21477528
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658013
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
накатал пример
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658018
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,
Dimitry Sibiryakov,

Да, да, я плохой - это понятно. Делать то чё?
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658019
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кукареку,

А тебя не наталкивает на какую-то мысль, что ты при таком раскладе ловишь AV, а я нет? ;)
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658022
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovSOFT FOR YOUПосле создания консоли, я её настраиваю
Задаю размеры, область вывода, позиционирую в центр экрана, меняю Caption

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


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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
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;



Подумай все же о военной службе.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658035
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Нет спасибо )
Я лучше буду делать Sleep(100) или разберусь с AttachConsole
Чем задавать позицию окна через реестр при завершении приложения
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658039
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUчччД__,

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

А предложенный способ - вполне себе штатный и даже рекомендованный Microsoft.
Более того, сей способ "по умолчанию" реализован многими системами программирования при построении консольных приложений.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658043
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__,

Посмотрим
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658078
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,

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

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



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

проверяй
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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.

...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658101
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
руки дошли сделать поиск в кодах среды.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658102
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
руки дошли сделать поиск в кодах среды.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658124
Фотография kloun02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кукареку,

var параметр, учи матчасть.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658157
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kloun02,

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


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




Что же ты ему не кинулся ошибку ЕГО то показывать? за то решил показать свой тугенький ум на мне )))
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658179
Фотография kloun02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кукарекуkloun02,

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


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





Что же ты ему не кинулся ошибку ЕГО то показывать? за то решил показать свой тугенький ум на мне )))Нет, эту дичь делал ты, исключительно. В коде мегаотца все было в пределах нормы.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658197
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__ 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, значит проинициализировалась.

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

Алоцировать консоль, что бы туда что-то выводить.... Мне не очень понятно. А особенно, с такими мучениями и "кривостями" как воровство чужой консоли (((
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658207
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kloun02Нет, эту дичь делал ты, исключительно. В коде мегаотца все было в пределах нормы.

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

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

Ошибка возникает здесь:
Код: pascal
1.
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Удивительно

Вот такой обрабатывается нормально:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    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 не предлагать. Должно быть какое-то здоровое решение

и если после этого ты продолжишь гнуть свою палку, то ты просто его попа лиз
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658211
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы такого работника SOFT FOR YOU , сразу уволил после такого кода
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658213
Фотография kloun02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КукарекуВот его сообщения, где он делал эту дичь
Слушай, что я тебе скажу, птичка..(с)
Я видел весь код этого топика, и указал тебе твои пробелы в знаниях 21478186

Тебе бы вместо разбрасывания соплей по форуму, взять бы да попробовать скомпилить его код.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658215
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вот, что бы сразу все вопросы отпали. Типа - мол есть какая то проверка на nil указатель (от куда бы ему взяться ? И все равно бы не помогло)
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658217
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kloun02,

Все. Ты его попа лиз. Официально заявлено и подтверждено !
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658225
Фотография kloun02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кукарекуkloun02,

Все. Ты его попа лиз. Официально заявлено и подтверждено !Болезный на вот тебе
Код: pascal
1.
2.
3.
4.
5.
procedure Test(var i: Cardinal);
begin
  if @i <> nil then
    i := 3465;
end;
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658234
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кукареку,

Ты заколебал


Leonid Kudryavtsev,

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


All,

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
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;
}

...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658267
Фотография kloun02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кукареку,

жду официальных опровержений
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658279
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА тебя не наталкивает на какую-то мысль, что ты при таком раскладе ловишь AV, а я нет? ;)Справедливости ради
lpNumberOfCharsWritten [ out ]
A pointer to a variable that receives the number of characters actually written.Про optional ничего нет, хотя MS обычно о таких вещах пишет
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39658460
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev...Лично я, в свое время, наоборот рисовал свое окошко и направлял туда вывод консольных приложений, что бы выглядело более-менее "прилично" и вывод внешнего приложения не выпадал из дизайна.
...
+1
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39661170
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Передача (nil)^ в var-параметр - хоть и смахивает на хак, но работает корректно. Компилятор не вычисляет это выражение, а сразу пишет 0:
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Test(a: Byte; var i: Byte);
begin

end;

Test(10, PByte(nil)^);


Код: sql
1.
2.
3.
4.
RTDecoder.dpr.17: Test(10, PByte(nil)^);
00747588 33D2             xor edx,edx
0074758A B00A             mov al,$0a
0074758C E88F49FFFF       call Test


НО ! Это подходит только для необязательных var параметров (те, которые предварительно проверяются как указатели - через @param для функций Delphi или объявлены указателями для импортированных функций). Как только функция попытается использовать значение параметра - случится бадабум.
...
Рейтинг: 0 / 0
CreateProcess-аналог AllocConsole
    #39661172
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2 НО ! Это подходит только для необязательных var параметров (те, которые предварительно проверяются как указатели - через @param для функций Delphi или объявлены указателями для импортированных функций). Как только функция попытается использовать значение параметра - случится бадабум.
...или те, которые не используются при некоторых условиях. Например, вот такая конструкция также будет работать: Move(Src, (nil)^, 0);
...
Рейтинг: 0 / 0
95 сообщений из 95, показаны все 4 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CreateProcess-аналог AllocConsole
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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