Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.09;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2002.09.09;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.006 c
3-26861
Sergey V. Shadrin
2002-08-19 12:03
2002.09.09
данные


14-27236
Chesterfield
2002-08-15 20:15
2002.09.09
Хамство


3-26934
ivlex
2002-08-17 07:48
2002.09.09
О работе с базой Access через ODBC


1-27089
c0pyc@t
2002-08-28 09:36
2002.09.09
Уникальный ID


14-27237
bde
2002-08-13 10:37
2002.09.09
Напомните плиз какая посл. версия BDE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский