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

Откуда:
Сообщений: 229
Как всегда, раньше всё работало, а сейчас не хочет. Причину понять не могу.
Если в лоб то CreateProcess работает только если я вызываю его напрямую (например на нажатие кнопки):
Вот тут всё работает:

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;

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

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;

и выдает ошибку с картинки.

К сообщению приложен файл. Размер - 5Kb
4 авг 19, 17:38    [21941618]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Изначально ошибка возникла в потоке, где было ещё непонятнее, при наличии параметров CreateProcess выдавала успех и Handle, который потом успешно проверялся на существование, но нужную мне программу не запускала.

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

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

При том ранее код работал и ничего принципиального не менял (вроде как в CreateProcess вообще параметры один в один приходят как раньше, но не уверен).
В чем может быть причина?

К сообщению приложен файл. Размер - 8Kb
4 авг 19, 17:40    [21941620]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Андрей Игоревич,

Кто будет выделять память и заполнять SI и PI?
4 авг 19, 17:47    [21941621]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 549
Андрюха,

переменную si инициализировать кто будет?
4 авг 19, 17:50    [21941622]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
ёёёёё
Member

Откуда:
Сообщений: 1295
У меня тут компа нет, и интернета тоже нет.
Но вот, например:
CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'),...

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

И, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь.
4 авг 19, 17:53    [21941625]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
asutp2
Андрюха,

переменную si инициализировать кто будет?

Gator
Андрей Игоревич,

Кто будет выделять память и заполнять SI и PI?

Так этож записи, яж их в варе призвал.
А заполнять - там же куча параметров, которые (по крайней мере для теста) мне не нужны, и как я понимал из описания - не требуют присвоения (хотя, может, ошибся), но неужто мне всю это надо прописывать каждый раз, мне даже вникать то в них было лень, всякие координаты левого угла, активные мониторы и прочее...?
+
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;


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

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

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

Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись?
4 авг 19, 18:05    [21941636]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

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

Андрей Игоревич
Так этож записи, яж их в варе призвал.

Поэтому они забиты мусором и не проходят проверку валидности. Не выпендривайся, инициализируй.

Posted via ActualForum NNTP Server 1.5

4 авг 19, 18:08    [21941639]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Андрей Игоревич,

Не...

Так работает

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;


А так - нет

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;
4 авг 19, 18:10    [21941640]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Андрей Игоревич,
Ладно, признаю свою ошибку, программа по крайней мере запускается (хотя и как-то странно) после того как прописал
 
   si.lpDesktop:=nil;

Зачем, почему, и вообще что я тут должен писать... Теперь чтоль все параметры прописывать...
Может это из-за двух мониторов, блин, теперь кучу времени вникать в параметры, эх, а в статье про CreateProcess писали - хорошая функция, простая, а параметры вам не нужны...
4 авг 19, 18:19    [21941645]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

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

Андрей Игоревич
Теперь чтоль все параметры прописывать...

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

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

Posted via ActualForum NNTP Server 1.5

4 авг 19, 18:26    [21941651]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Dimitry Sibiryakov
Андрей Игоревич
Теперь чтоль все параметры прописывать...

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

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


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

FillChar(si, SizeOf(STARTUPINFO), 0);
si.cb := SizeOf(TStartUpInfo);
4 авг 19, 18:47    [21941666]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
ёёёёё
Member

Откуда:
Сообщений: 1295
Андрей Игоревич
...

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

Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись?


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

...поэтому, если вера твоя недостаточно крепка, параметры следует инициализировать явно.
4 авг 19, 19:06    [21941671]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
alekcvp
Member

Откуда:
Сообщений: 1633
Андрей Игоревич
Ага, нашел, вроде то.

FillChar(si, SizeOf(STARTUPINFO), 0);
si.cb := SizeOf(TStartUpInfo);

Лучше всё-таки использовать один тип - тот, с которым она объявлена. Конкретно в этом месте это некритично, но привычку лучше завести, иначе в другой ситуации при рефакторинге, например, могут быть сюрпризы.
4 авг 19, 19:22    [21941679]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Cobalt747
Member

Откуда:
Сообщений: 2128
FillChar(si, SizeOf(si), 0);
si.cb := SizeOf(si);
5 авг 19, 10:44    [21941923]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Василий 2
Member

Откуда:
Сообщений: 799
Забудьте вы про замшелый FillChar, пора юзать Default.
Да, и странно, что никто не вспомнил, что CmdLine не должна быть константой - см. MSDN по CreateProcessW
5 авг 19, 13:40    [21942071]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Понимаю, что опять люди напишут мнение обо мне своё мнение :) , но что-то не могу сообразить. А в мануалах на английском как-то тону сам...
Как работает IsWindow(Handle) или как корректно работать с Handle;

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

          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);
          


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

        if  IsWindow(pi.hProcess) then ...; 
        sleep (100);

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

Если же убить процесс через
TerminateProcess(pi.hProcess, 0);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

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

П.С. Я знаю что можно ожидать завершения процесса через WaitforSingleObject, но тут уже более осозновательный интерес. Ведь если IsWindow выдает true - значит идет утечка?
5 авг 19, 16:33    [21942219]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1375
Андрей Игоревич,

хмм, странная практика - передавать хендл процесса туда где нужен хендл окна. плюс, в хелпе пишут, что не рекомендуют использовать IsWindow для определения окон в других потоках. а цель какая?
5 авг 19, 16:42    [21942231]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Zelius
Андрей Игоревич,

хмм, странная практика - передавать хендл процесса туда где нужен хендл окна. плюс, в хелпе пишут, что не рекомендуют использовать IsWindow для определения окон в других потоках. а цель какая?

Из основной программы запускаю расчетные модули, расчетные модули считают (нередко долго, часы и дни каждый), по завершении сами закрываются, иногда надо запустить до сотни расчетных модулей, запускать их все - сами понимаете, потому нужно отслеживать сколько их запущено в данный момент и дозапускать по мере закрытия. Сделать это можно разными способами (до того сделал простым пересчетом процессов по имени), теперь вот решил попробовать запомнить Хандлы и раз в некоторое время проверять на "запущенность". Но как-то не получилось :).
5 авг 19, 17:04    [21942252]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

05.08.2019 17:04, Андрей Игоревич пишет:
> ...проверять на "запущенность".
> Но как-то не получилось...

обучаю аппендэктомии (trans tonsils).
по переписке.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:09    [21942259]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

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

Андрей Игоревич
Но как-то не получилось :).

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

А лучше всё-таки использовать потоки и паттерн producer-consumer для раздавания им заданий
для обработки.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:11    [21942262]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

05.08.2019 17:11, Dimitry Sibiryakov пишет:
> А лучше всё-таки использовать потоки

не внемлет.
ибо играет вдохновенно...

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:15    [21942269]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

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

Dimitry Sibiryakov
Надо периодически проверять через GetExitCodeProcess() его состояние

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

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

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

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:22    [21942279]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
alekcvp
Member

Откуда:
Сообщений: 1633
Андрей Игоревич
Из основной программы запускаю расчетные модули, расчетные модули считают (нередко долго, часы и дни каждый), по завершении сами закрываются, иногда надо запустить до сотни расчетных модулей, запускать их все - сами понимаете, потому нужно отслеживать сколько их запущено в данный момент и дозапускать по мере закрытия.

ИМХО, я бы сделал отдельный поток для управления этими процессами, в который бы засунул семафор для управления потоком и массив хэндлов для процессов, после чего в цикле запускал бы нужное количество процессов и делал WaitForMultiplyObjects(...., INFINITE) для семафора и процессов. Пока процессы работают - он спит и не потребляет ресурсы, когда какой-то процесс завершается мы в цикле перебираем массив вызовом GetExitCodeProcess(), закрываем хэндлы неактивных процессов и перезапускаем их, после чего снова ждём. Если сработал семафор - завершаем поток. По желанию можно при этом принудительно завершить все вторичные процессы.

Управлять потоком из гуя - через семафор.
5 авг 19, 17:23    [21942282]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

05.08.2019 17:23, alekcvp пишет:
> Управлять потоком из гуя - через семафор.

гуй не нужен

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:25    [21942283]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
alekcvp
Member

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

Можно не перебирать, а сразу перезапускать нужный, т.к. индекс мы знаем после Wait...()
5 авг 19, 17:25    [21942285]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить