powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не корректно работает CreateProcess.
25 сообщений из 60, страница 1 из 3
Не корректно работает CreateProcess.
    #39845130
Как всегда, раньше всё работало, а сейчас не хочет. Причину понять не могу.
Если в лоб то CreateProcess работает только если я вызываю его напрямую (например на нажатие кнопки):
Вот тут всё работает:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.TestClick(Sender: TObject);
var
  si: TStartupInfo;
  pi: TProcessInformation;
begin
    CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
   //прямой путь тоже работает
end;


А вот так - нет:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure Test2;
var
  si: TStartupInfo;
  pi: TProcessInformation;
Begin
   CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
end;

procedure TCoreShell.TestClick(Sender: TObject);
begin
 Test2;
end;


и выдает ошибку с картинки.
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845131
Изначально ошибка возникла в потоке, где было ещё непонятнее, при наличии параметров CreateProcess выдавала успех и Handle, который потом успешно проверялся на существование, но нужную мне программу не запускала.

При отключении параметров и выборе чисто пути к файлу (ну для теста), выдавала ошибку с картинки.

Но ShellExecute в том же коде и в том же месте работает прекрасно (но мне то Хандл нужен..).

При том ранее код работал и ничего принципиального не менял (вроде как в CreateProcess вообще параметры один в один приходят как раньше, но не уверен).
В чем может быть причина?
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845133
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

Кто будет выделять память и заполнять SI и PI?
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845134
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрюха,

переменную si инициализировать кто будет?
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845137
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тут компа нет, и интернета тоже нет.
Но вот, например:
Код: pascal
1.
CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'),...


Если у тебя юникодный дельфи, то не следует ли использовать просто pchar? Хотя, тут просто приведение типа к указателю, но ведь пчар у нас волшебный тип...

И, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь.
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845144
asutp2Андрюха,

переменную si инициализировать кто будет?
GatorАндрей Игоревич,

Кто будет выделять память и заполнять SI и PI?
Так этож записи, яж их в варе призвал.
А заполнять - там же куча параметров, которые (по крайней мере для теста) мне не нужны, и как я понимал из описания - не требуют присвоения (хотя, может, ошибся), но неужто мне всю это надо прописывать каждый раз, мне даже вникать то в них было лень, всякие координаты левого угла, активные мониторы и прочее...?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
TStartUpInfo = record
cb: Longword; 
lpReserved: PChar; 
lpDesktop: PChar; 
lpTitle: PChar; 
dwX: Longword; 
dwY: Longword; 
dwXSize: Longword; 
dwYSize: Longword; 
dwXCountChars: Longword; 
dwYCountChars: Longword; 
dwFillAttribute: Longword; 
dwFlags: Longword; 
wShowWindow: Word; 
cbReserved2: Word; 
lpReserved2: PByte; 
hStdInput: THandle; 
hStdOutput: THandle; 
hStdError: THandle;
end;



ёёёёёУ меня тут компа нет, и интернета тоже нет.
Но вот, например:
Код: pascal
1.
CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'),...


Если у тебя юникодный дельфи, то не следует ли использовать просто pchar? Наверно стоит, но не это причина ошибки...

ёёёёёИ, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь.
Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись?
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845145
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичТак этож записи, яж их в варе призвал.

Поэтому они забиты мусором и не проходят проверку валидности. Не выпендривайся, инициализируй.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845146
Андрей Игоревич,

Не...

Так работает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TCoreShell.TestClick(Sender: TObject);
var
  si: TStartupInfo;
  pi: TProcessInformation;
begin
 //Test2 (si);
  CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
end;



А так - нет

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure Test2 (si: TStartupInfo);
var
  //si: TStartupInfo;
  pi: TProcessInformation;
Begin
  CreateProcess (nil, PChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
end;

procedure TCoreShell.TestClick(Sender: TObject);
var
  si: TStartupInfo;
  pi: TProcessInformation;

begin
 Test2 (si);
//  CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
end;
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845148
Андрей Игоревич,
Ладно, признаю свою ошибку, программа по крайней мере запускается (хотя и как-то странно) после того как прописал
Код: pascal
1.
2.
 
   si.lpDesktop:=nil;


Зачем, почему, и вообще что я тут должен писать... Теперь чтоль все параметры прописывать...
Может это из-за двух мониторов, блин, теперь кучу времени вникать в параметры, эх, а в статье про CreateProcess писали - хорошая функция, простая, а параметры вам не нужны...
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845152
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичТеперь чтоль все параметры прописывать...

Во всех примерах структуры сначала обнуляются целиком (FillChar()), а потом удёт
присвоение одному-двум нужным параметрам.

И читать надо было документацию, а не левую статью какого-то ламера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845163
Dimitry SibiryakovАндрей ИгоревичТеперь чтоль все параметры прописывать...

Во всех примерах структуры сначала обнуляются целиком (FillChar()), а потом удёт
присвоение одному-двум нужным параметрам.

И читать надо было документацию, а не левую статью какого-то ламера.


Ага, нашел, вроде то.

FillChar(si, SizeOf(STARTUPINFO), 0);
si.cb := SizeOf(TStartUpInfo);
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845168
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич...

ёёёёёИ, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь.
Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись?

1. Никто не знает, когда наступит час Суда, кроме Аллаху Субхану ва Тааля.
2. Никто не знает когда, где и сколько дождя прольется с неба, кроме Аллаха.
3. Никто наверняка не знает, что происходит в утробе беременной женщины, кроме Всевышнего.
4. Ни один человек не знает, что принесет ему завтрашний день и какое его будущее ожидает, кроме Аллаха.
5. Никто, кроме Всевышнего Аллаха, не знает, на какой земле, когда и каким образом прекратится его жизнь в этом мире.

...поэтому, если вера твоя недостаточно крепка, параметры следует инициализировать явно.
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845175
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичАга, нашел, вроде то.

FillChar(si, SizeOf( STARTUPINFO ), 0);
si.cb := SizeOf( TStartUpInfo );
Лучше всё-таки использовать один тип - тот, с которым она объявлена. Конкретно в этом месте это некритично, но привычку лучше завести, иначе в другой ситуации при рефакторинге, например, могут быть сюрпризы.
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845305
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
FillChar(si, SizeOf(si), 0);
si.cb := SizeOf(si);
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845385
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забудьте вы про замшелый FillChar, пора юзать Default.
Да, и странно, что никто не вспомнил, что CmdLine не должна быть константой - см. MSDN по CreateProcessW
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845458
Понимаю, что опять люди напишут мнение обо мне своё мнение :) , но что-то не могу сообразить. А в мануалах на английском как-то тону сам...
Как работает IsWindow(Handle) или как корректно работать с Handle;

Запускаю процесс через CreateProcess, далее процесс закрывается руками (крестиком на форме), но крутящаяся в цикле в потоке IsWindow продолжает выдавать True на вопрос о его существование;

Код: pascal
1.
2.
3.
4.
5.
          CreateProcess (nil, PChar(Core_1Path+parameters), nil, nil, true, CREATE_NEW_CONSOLE, nil, PChar(DirPath), si, pi);
          WaitForInputIdle(pi.hProcess, INFINITE);
          CloseHandle(pi.hProcess); //закрытие или нет тут ни на что не влияет
          CloseHandle(pi.hThread);
          



Далее в цикле в крутится

Код: pascal
1.
2.
        if  IsWindow(pi.hProcess) then ...; 
        sleep (100);


И при закрытии "руками" - IsWindow(MyHandle) всё равно выдает True.

Если же убить процесс через
Код: pascal
1.
2.
3.
TerminateProcess(pi.hProcess, 0);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);


то тогда всё нормально и IsWindow уже выдает false;
Вопрос - почему так, видимо я не понимаю что есть handle или как оно работает.

П.С. Я знаю что можно ожидать завершения процесса через WaitforSingleObject, но тут уже более осозновательный интерес. Ведь если IsWindow выдает true - значит идет утечка?
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845460
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

хмм, странная практика - передавать хендл процесса туда где нужен хендл окна. плюс, в хелпе пишут, что не рекомендуют использовать IsWindow для определения окон в других потоках. а цель какая?
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845475
ZeliusАндрей Игоревич,

хмм, странная практика - передавать хендл процесса туда где нужен хендл окна. плюс, в хелпе пишут, что не рекомендуют использовать IsWindow для определения окон в других потоках. а цель какая?
Из основной программы запускаю расчетные модули, расчетные модули считают (нередко долго, часы и дни каждый), по завершении сами закрываются, иногда надо запустить до сотни расчетных модулей, запускать их все - сами понимаете, потому нужно отслеживать сколько их запущено в данный момент и дозапускать по мере закрытия. Сделать это можно разными способами (до того сделал простым пересчетом процессов по имени), теперь вот решил попробовать запомнить Хандлы и раз в некоторое время проверять на "запущенность". Но как-то не получилось :).
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845479
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.08.2019 17:04, Андрей Игоревич пишет:
> ...проверять на "запущенность".
> Но как-то не получилось...

обучаю аппендэктомии (trans tonsils).
по переписке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845481
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичНо как-то не получилось :).

Потому что неправильно пробовал. Не надо закрывать хэндл запущенного процесса. Надо
периодически проверять через GetExitCodeProcess() его состояние и закрывать хэндл только
после получения чего-то отличного от STILL_ACTIVE. И запускать после этого новый процесс.

А лучше всё-таки использовать потоки и паттерн producer-consumer для раздавания им заданий
для обработки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845483
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.08.2019 17:11, Dimitry Sibiryakov пишет:
> А лучше всё-таки использовать потоки

не внемлет.
ибо играет вдохновенно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845489
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНадо периодически проверять через GetExitCodeProcess() его состояние

Или лучше даже не проверять, а просто ожидать завершения любого из них с помощью
WaitForMultipleObjects().

Мимопроходящийне внемлет.

Ну, для тех, у кого "расчетные модули" могут внезапно упасть на вторые сутки работы, это
может быть необходимым костылём.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845491
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичИз основной программы запускаю расчетные модули, расчетные модули считают (нередко долго, часы и дни каждый), по завершении сами закрываются, иногда надо запустить до сотни расчетных модулей, запускать их все - сами понимаете, потому нужно отслеживать сколько их запущено в данный момент и дозапускать по мере закрытия.
ИМХО, я бы сделал отдельный поток для управления этими процессами, в который бы засунул семафор для управления потоком и массив хэндлов для процессов, после чего в цикле запускал бы нужное количество процессов и делал WaitForMultiplyObjects(...., INFINITE) для семафора и процессов. Пока процессы работают - он спит и не потребляет ресурсы, когда какой-то процесс завершается мы в цикле перебираем массив вызовом GetExitCodeProcess(), закрываем хэндлы неактивных процессов и перезапускаем их, после чего снова ждём. Если сработал семафор - завершаем поток. По желанию можно при этом принудительно завершить все вторичные процессы.

Управлять потоком из гуя - через семафор.
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845492
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.08.2019 17:23, alekcvp пишет:
> Управлять потоком из гуя - через семафор.

гуй не нужен
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не корректно работает CreateProcess.
    #39845493
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Можно не перебирать, а сразу перезапускать нужный, т.к. индекс мы знаем после Wait...()
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не корректно работает CreateProcess.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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