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

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

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

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

Лень

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

Откуда: Тула
Сообщений: 1949
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

Откуда:
Сообщений: 38970
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

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

чччД__
успешное выполнение 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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Delphi Ответить