Форум: "WinAPI";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
ВнизCreateProcess и Winexec при работе с консольным приложением. Найти похожие ветки
← →
Rash (2002-07-18 00:16) [0]Здравствуйте. Люди, объясните пожалуйста:
почему при таком коде:
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? (Делаю по примерам с форума)
← →
Almaz (2002-07-18 01:58) [1]
> Rash © (18.07.02 00:16)
Я запустил ваш пример под Win2000 - окно не появлялось не в одном из случаев. А какую систему используете вы ?
Удачи.
← →
Rash (2002-07-18 10:34) [2]У меня 98 Windows.
Если убрать эту строку:
WaitForSingleObject(Psi.hProcess, INFINITE);
то все работает. Вопрос теперь в том, насколько корректным этот код будет как для 98 так и для 2000. Обязательно ли должна быть какая-нибудь функция ожидания события, или может, в этой должны быть какие-то другие параметры?
← →
FLAME (2002-07-18 16:11) [3]>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, либо вместо //...// программно закрывать консольное окно.
← →
Rash (2002-07-18 20:34) [4]>виной тому наверное SW_HIDE
Так оно и есть, мне требуется , чтобы процесс был незаметен для пользователя.
WaitForSingleObject(psi.hProcess,infinite) - приводит к бесконечному ожиданию действия. Поэтому окно "сеанс завершен" остается. По его закрытию программа работает дальше. Мне же нужно, чтобы программа начинала работать дальше по завершению архивации, а не по закрытию окна.
← →
Proton (2002-07-18 22:47) [5]> 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;
CreateProcess(nil,
{$ifdef home}
PCHAR("rar32 a test.zip "+"C:\Video\nge\nge-01.viv")
{$else}
PCHAR("rar32 a test.zip "+Application.EXENAME)
{$endif}
,nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,si,pi);
CloseHandle(Pi.hThread);
with tanimate.Create(self) do
begin
Parent := self;
Align := alClient;
BringToFront;
CommonAVI := aviCopyFiles;
Active := True;
StopFrame := 34;
while WaitForSingleObject(Pi.hProcess, 10) = WAIT_TIMEOUT do
Application.ProcessMessages;
free;
end;
if GetExitCodeProcess(Pi.hProcess,xc) then
showMessage(inttostr(xc));
CloseHandle(Pi.hProcess);
end;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c