Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


WaitForSingleObject for 'shell32.dll,OpenAs_RunDLL'


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
a_Lex
Гость







СообщениеВт, 18-Окт-2005 9:51    Заголовок сообщения: WaitForSingleObject for 'shell32.dll,OpenAs_RunDLL'
Цитата

При отслеживания конца работы процесса, запущенного с помощью диалога 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
СообщениеВт, 18-Окт-2005 10:04 
Цитата

WaitForSingleObject(ShellExecuteInfo.hProcess, INFINITE)
_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
a_Lex
Гость







СообщениеВт, 18-Окт-2005 10:42 
Цитата

INFINITE не подходит, уже пробовал! WaitForSingleObject все равно будет возвращать WAIT_OBJECT_0 от диалога.
А мне еще и нужно форму основного приложения перерисовывать!
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеСр, 19-Окт-2005 4:34 
Цитата

попробуй отказаться от 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;

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
a_Lex
Гость







СообщениеСр, 19-Окт-2005 8:53 
Цитата

Спасибо, работает отлично!
Не использовал CreateProcess , так как нужно было, что бы документы открывались автоматически (по расширению, что и делате ShellExec, ShellExecEx). Но с диалогом Open As, это уже лишнее! Счастлив
В начало
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100