| Автор
| Сообщение |
|
|
|
Цитата |
|
При отслеживания конца работы процесса, запущенного с помощью диалога Open As, WaitForSingleObject возвращает WAIT_OBJECT_0 n-раз, что мешает отловить конец работы процесса. Подскажите как это обойти!
| Код: |
FillChar(ShellExecuteInfo, SizeOf(TShellExecuteInfo), 0);
with ShellExecuteInfo do begin
cbSize := Sizeof(TShellExecuteInfo);
Wnd := Form1.Handle;
lpFile := PChar('rundll32.exe');
lpParameters:=PChar('shell32.dll,OpenAs_RunDLL ' + fileName);
lpVerb := 'open';
nShow := SW_SHOWNORMAL;
fMask := SEE_MASK_NOCLOSEPROCESS;
end;
try
if ( not ShellExecuteEx(@ShellExecuteInfo)) then result:=0
else begin
while (true) do begin
if (WaitForSingleObject(ShellExecuteInfo.hProcess, 200)=WAIT_OBJECT_0) then begin
Application.ProcessMessages;
Form1.Repaint;
result:=1;
break;
end;
Application.ProcessMessages;
Form1.Repaint;
end;
end;
finally
CloseHandle(ShellExecuteInfo.hProcess);
end;
|
Хотя без диалога Open As Все работает ОК:
| Код: |
FillChar(ShellExecuteInfo, SizeOf(TShellExecuteInfo), 0);
with ShellExecuteInfo do begin
cbSize := Sizeof(TShellExecuteInfo);
Wnd := Form1.Handle;
lpFile := PChar(fileName);
lpParameters:=nil;
lpVerb := 'open';
nShow := SW_SHOWNORMAL;
fMask := SEE_MASK_NOCLOSEPROCESS;
end; |
|
|
| В начало |
|
 |
|
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
WaitForSingleObject(ShellExecuteInfo.hProcess, INFINITE) _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
INFINITE не подходит, уже пробовал! WaitForSingleObject все равно будет возвращать WAIT_OBJECT_0 от диалога.
А мне еще и нужно форму основного приложения перерисовывать! |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
попробуй отказаться от ShellExecuteEx, используй CreateProcess
| Код: |
var
.....
si: TStartupInfo;
pi: PROCESS_INFORMATION;
.....
ZeroMemory(@si, sizeof(si));
si.cb:=sizeof(si);
if not CreateProcess(nil, PChar('rundll32.exe shell32.dll,OpenAs_RunDLL '+FileName),
nil, nil, false, 0, nil, nil, si, pi) then result:=0
else
try
while WaitForSingleObject(pi.hProcess,200)=WAIT_TIMEOUT do
Application.ProcessMessages;
finally
closehandle(pi.hProcess);
end;
end; |
_________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Спасибо, работает отлично!
Не использовал CreateProcess , так как нужно было, что бы документы открывались автоматически (по расширению, что и делате ShellExec, ShellExecEx). Но с диалогом Open As, это уже лишнее!  |
|
| В начало |
|
 |
|