Не корректно работает CreateProcess.

Андрей Игоревич
Дата: 04.08.2019 17:38:20
Как всегда, раньше всё работало, а сейчас не хочет. Причину понять не могу.
Если в лоб то 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;

и выдает ошибку с картинки.
Андрей Игоревич
Дата: 04.08.2019 17:40:24
Изначально ошибка возникла в потоке, где было ещё непонятнее, при наличии параметров CreateProcess выдавала успех и Handle, который потом успешно проверялся на существование, но нужную мне программу не запускала.

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

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

При том ранее код работал и ничего принципиального не менял (вроде как в CreateProcess вообще параметры один в один приходят как раньше, но не уверен).
В чем может быть причина?
Gator
Дата: 04.08.2019 17:47:52
Андрей Игоревич,

Кто будет выделять память и заполнять SI и PI?
asutp2
Дата: 04.08.2019 17:50:42
Андрюха,

переменную si инициализировать кто будет?
ёёёёё
Дата: 04.08.2019 17:53:04
У меня тут компа нет, и интернета тоже нет.
Но вот, например:
CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'),...

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

И, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь.
Андрей Игоревич
Дата: 04.08.2019 18:05:46
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 глянь.

Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись?
Dimitry Sibiryakov
Дата: 04.08.2019 18:08:24

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

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

Posted via ActualForum NNTP Server 1.5

Андрей Игоревич
Дата: 04.08.2019 18:10:38
Андрей Игоревич,

Не...

Так работает

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;
Андрей Игоревич
Дата: 04.08.2019 18:19:45
Андрей Игоревич,
Ладно, признаю свою ошибку, программа по крайней мере запускается (хотя и как-то странно) после того как прописал
 
   si.lpDesktop:=nil;

Зачем, почему, и вообще что я тут должен писать... Теперь чтоль все параметры прописывать...
Может это из-за двух мониторов, блин, теперь кучу времени вникать в параметры, эх, а в статье про CreateProcess писали - хорошая функция, простая, а параметры вам не нужны...
Dimitry Sibiryakov
Дата: 04.08.2019 18:26:32

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

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

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

Posted via ActualForum NNTP Server 1.5