Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Word против waitForSingleObject


Автор: OlafShadow 24.11.2006, 19:33
Здравствуйте, 
использую ShellExecuteEx для открытия файлов различных типов. Нужно дожидаться окончания работы запущенной программы, для этого использую 

WaitForSingleObject:

Код

var
  ShellExecuteInfo: TShellExecuteInfo;
  fn: string;
 ...........
  fn:= 'какой-то файл';

  FillChar(ShellExecuteInfo, SizeOf(TShellExecuteInfo), 0);
  with ShellExecuteInfo do begin
    cbSize := Sizeof(TShellExecuteInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(fn);
    lpVerb := 'open';
    nShow := SW_SHOWNORMAL;
  end;

  if ShellExecuteEx(@ShellExecuteInfo) then
  begin
      waitForSingleObject(ShellExecuteInfo.hProcess, INFINITE);
      MessageBox(0, 'Все кончено!!!', nil, 0);
  end;


   Все работает прекрасно, до тех пор, пока не начинаю открывать *.doc - файлы. При попытке закрытия Word виснет, и соответственно ожидание в 

waitForSingleObject не заканчивается. 
   Может кто проверит этот код у себя, т.к. подозреваю дело может быть в моем "мс офисе". Правда тот же excel нормально закрывается. Пробовал для 

проверки закрытия процесса использовать GetExitCodeProcess, но с вордом те же грабли smile

Код

repeat
    sleep(200);
    GetExitCodeProcess(ShellExecuteInfo.hProcess, ExitCode);
until ExitCode <> STILL_ACTIVE;

Автор: RideX 24.11.2006, 21:29
Попробуй просто запустить MS Word через CreateProcess, работает?

Автор: dumb 25.11.2006, 11:52
OlafShadow, проверяй hProcess перед тем, как его использовать.
Цитата

hProcess
Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.

Note ShellExecuteEx does not always return an hProcess, even if a process is launched as the result of the call. For example, an hProcess does not return when you use SEE_MASK_INVOKEIDLIST to invoke IContextMenu.


если нужно ожидать завершения, то лучше использовать CreateProcess.

Автор: OlafShadow 25.11.2006, 20:05
Спасибо всем откликнувшимся!

Проблема решена (на мастерах дельфи подсказали): надо так fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;

Мораль: ВНИМАТЕЛЬНЕЕ С ФЛАГАМИ :) !!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)