Createprocess і winexec при роботі з консольним додатком

CreateProcess і Winexec при роботі з консольним додатком.

Добрий день. Люди, поясніть будь ласка:
чому при такому коді:
if winexec (arjpchar, SW_HIDE) <= 31 then label3.caption:="Архивация не произведена"
else label3.caption: = "Архівація завершена";
вікно консолі не відкрилося взагалі,
а при цьому.
sui.dwFlags: = startf_UseShowWindow;
sui.wshowWindow: = SW_hide;

if not CreateProcess (nil, arjpchar, nil, nil, false, 0, nil, nil, sui, psi) then
begin
label3.caption: = "failed";
Exit;
end;
CloseHandle (Psi.hThread);
WaitForSingleObject (Psi.hProcess, INFINITE);
CloseHandle (Psi.hProcess);

вікно по закінченню архівації не закривається? в довідці написано, що winexec - це виклик CreateProcess. Мені треба чимось замінити waitforsingleobject? (Роблю за прикладами з форуму)

> If winexec (arjpchar, SW_HIDE) <= 31 then>label3.caption: = "Архівація не проведена"
> Else label3.caption: = "Архівація завершена";
> Вікно консолі не відкрилося взагалі
виною тому напевно SW_HIDE

> If not CreateProcess (nil, arjpchar, nil, nil, false, 0, nil, nil, sui, psi)
Чому dwCreationFlags = 0? І навіщо потрібен CloseHandle (Psi.hThread)?
Я б зробив так (IMHO):
IF not CreateProcess (nil, arjpchar, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, sui, psi) then
begin
label3.caption: = "failed";
Exit;
end else
begin
WaitForSingleObject (psi.hProcess, infinite);
CloseHandle (psi.hProcess);
//. //
end;
Щоб вікно закривалося потрібно створити відповідний pif, або замість //. // програмно закривати консольне вікно.

> Виною тому напевно SW_HIDE
Так воно і є, мені потрібно. щоб процес був непомітний для користувача.

WaitForSingleObject (psi.hProcess, infinite) - призводить до нескінченного очікування дії. Тому вікно "сеанс завершено" залишається. За його закриття програма працює далі. Мені ж потрібно, щоб програма починала працювати далі по завершенню архівації, а не по закриттю вікна.

> If winexec (arjpchar, SW_HIDE) <= 31 then
. SW_HIDE - вікно консолі все одно висить в пам'яті що не зовсім коректно
> Sui, psi
а ви їх нулями заповнюєте. і sizeof привласнюєте?
я б вам порекомендував користуватися не ДОСовскіх архиватором а конслоним (win32) - всі ваші проблеми відразу зникнуть
напрмер rar32 (якщо треба кину на мило)

в консолнних архіваторах консоль сама закривається а не чекає поки її закриють
ось восмотрі що я тобі придумав

procedure TForm1.Button1Click (Sender: TObject);
var si: STARTUPINFO;
pi: PROCESS_INFORMATION;
xc: cardinal;
begin
ZeroMemory (@ si, sizeof (si));
si.cb: = SizeOf (si);
si.wShowWindow: = SW_HIDE;
si.dwFlags: = STARTF_USESHOWWINDOW;

Пам'ять: 0.73 MB
Час: 0.041 c

Схожі статті