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


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