powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CreateProcess-аналог AllocConsole
25 сообщений из 95, страница 3 из 4
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
25 сообщений из 95, страница 3 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CreateProcess-аналог AllocConsole
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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