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

Вниз

ShellExecuteEx и WaitForSingleObject   Найти похожие ветки 

 
Близнец   (2006-05-19 09:21) [0]

Доброго времени суток!
Необходимо вывести сообщение только после завершения архивации. Использую код:

FillChar(ShellExecuteInfo, SizeOf(TShellExecuteInfo), 0);
with ShellExecuteInfo do
  begin
  cbSize := Sizeof(TShellExecuteInfo);
  Wnd := Handle;
  lpFile := PChar("winrar.exe");
  lpParameters:=PChar("a -agYYYYMMDD -ep1 -t -r "+"""+filename+"" +"""+dir_path+"\*.*" ");
  lpDirectory:=PChar(rar_path);
  lpVerb := "open";
  nShow := SW_SHOWNORMAL;
  end;
try
 if ShellExecuteEx(@ShellExecuteInfo) then
    begin
    while WaitforSingleObject(ShellExecuteInfo.hProcess,200)=WAIT_TIMEOUT   do
    Repaint;
    showmessage ("Архивирование "+dir_path+" закончено!")
    end
 else showmessage ("Архивирование "+dir_path+" завершилось неудачей!")
finally
 CloseHandle(ShellExecuteInfo.hProcess);
end;


Сообщение появляется сразу, как архивация начинается, а не после. Подскажите, что не так, плз.


 
balepa ©   (2006-05-19 09:50) [1]

while WaitforSingleObject(ShellExecuteInfo.hProcess,200)=WAIT_TIMEOUT   do
   Repaint;
   showmessage ("Архивирование "+dir_path+" закончено!")
end
Ну вопервых while нафик не нужен
Во-вторых ты поставил скажем так время ожидания 200 мс а за 200 мс ты заархивировать не успееш

DWORD WINAPI WaitForSingleObject(
 HANDLE hHandle,
 DWORD dwMilliseconds
);

Parameters
hHandle
[in] Handle to the object. For a list of the object types whose handles can be specified, see the following Remarks section.
If this handle is closed while the wait is still pending, the function"s behavior is undefined.

The handle must have the SYNCHRONIZE access right. For more information, see Standard Access Rights.

dwMilliseconds
[in] Time-out interval, in milliseconds. The function returns if the interval elapses, even if the object"s state is nonsignaled. If dwMilliseconds is zero, the function tests the object"s state and returns immediately. If dwMilliseconds is INFINITE, the function"s time-out interval never elapses.


 
Игорь Шевченко ©   (2006-05-19 09:56) [2]


> while WaitforSingleObject(ShellExecuteInfo.hProcess,200)=WAIT_TIMEOUT
>   do
>    Repaint;
>    showmessage ("Архивирование "+dir_path+" закончено!")
> end


Не пиши так больше никогда


 
Близнец   (2006-05-19 10:29) [3]

200 мс заменен на INFINITE, все по-прежнему...


 
balepa ©   (2006-05-19 10:36) [4]


> Близнец   (19.05.06 10:29) [3]
> 200 мс заменен на INFINITE, все по-прежнему...


While убрал ?


 
Близнец   (2006-05-19 10:47) [5]

да


 
balepa ©   (2006-05-19 10:50) [6]

Покажи как теперь


 
Близнец   (2006-05-19 13:08) [7]

if ShellExecuteEx(@ShellExecuteInfo) then
   begin
   WaitforSingleObject(ShellExecuteInfo.hProcess,INFINITE);
   showmessage ("Архивирование "+dir_path+" закончено!")
   end
      else showmessage ("Архивирование "+dir_path+" завершилось неудачей!")


 
Близнец   (2006-05-19 13:13) [8]

if ShellExecuteEx(@ShellExecuteInfo) then
   begin
   WaitforSingleObject(ShellExecuteInfo.hProcess,INFINITE);
   showmessage ("Архивирование "+dir_path+" закончено!")
   end
      else showmessage ("Архивирование "+dir_path+" завершилось неудачей!")


 
Сергей М. ©   (2006-05-19 13:31) [9]

if ShellExecuteEx(@ShellExecuteInfo) then
  case MsgWaitForMultipleObjects(1, @ShellExecuteInfo.hProcess, False, INFINITE, QS_ALLINPUT) of
  WAIT_OBJECT_0:
    showmessage ("Архивирование "+dir_path+" закончено!");
  WAIT_OBJECT_0 + 1:
    Application.ProcessMessages;    
  end
else
  showmessage ("Архивирование "+dir_path+" не то чтобы не завершилось - оно вообще не начато !")


 
Близнец   (2006-05-19 14:12) [10]

2 Сергей М.
если я пишу так:
if ShellExecuteEx(@ShellExecuteInfo) then
   if WaitforSingleObject(ShellExecuteInfo.hProcess,INFINITE)=WAIT_OBJECT_0 then
  showmessage ("Архивирование "+dir_path+" закончено!")
        else showmessage ("Архивирование "+dir_path+" завершилось неудачей!")

то, я так понимаю, для меня разницы с твоим вариантом никакой нет
результат - архивирование идет, сообщения вообще никакого не выдается


 
Игорь Шевченко ©   (2006-05-19 14:44) [11]

procedure TfMain.DumpFile(const FileName: string);
var
 ShellInfo: TShellExecuteInfo;
 ParamsString: string;
begin
 ParamsString := Format("-em %s %s.aaa", [FileName, FileName]);
 ShellInfo.cbSize := SizeOf(ShellInfo);
 ShellInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
 ShellInfo.Wnd := Handle;
 ShellInfo.lpVerb := "open";
 ShellInfo.lpFile := "tdump";
 ShellInfo.lpParameters := PChar(ParamsString);
 ShellInfo.lpDirectory := nil;
 ShellInfo.nShow := SW_SHOW;
 if not ShellExecuteEx(@ShellInfo) then
   RaiseLastWin32Error;
 if ShellInfo.hProcess <> 0 then
   try
     WaitForSingleObjectEx(ShellInfo.hProcess, INFINITE, false);
   finally
     CloseHandle(ShellInfo.hProcess);
   end;
end;



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.043 c
2-1147931585
Tempora
2006-05-18 09:53
2006.06.04
Application.terminate а программа продолжает работать


1-1145985711
Dmitry_177
2006-04-25 21:21
2006.06.04
Класс для хранения в файле списка списков


2-1148068810
yahaha
2006-05-20 00:00
2006.06.04
DHTMLEdit


3-1144690064
Рустем
2006-04-10 21:27
2006.06.04
Ошибка: Не удается найти строку для обновления...


15-1146045980
MsGuns
2006-04-26 14:06
2006.06.04
Почему так много злобы ?