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

Вниз

Word против waitForSingleObject   Найти похожие ветки 

 
trubin   (2006-11-24 19:29) [0]

Здравствуйте,
использую 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, но с вордом те же грабли :(

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


 
Kolan ©   (2006-11-24 19:31) [1]

> При попытке закрытия Word виснет

Ну так в этом наверно проблемма...


 
trubin   (2006-11-24 20:06) [2]


> Ну так в этом наверно проблемма...

Понятно что ожидание не заканчивается из-за зависания ворда, но почему это происходит, и что делать... ?


 
Kolan ©   (2006-11-24 20:23) [3]

> но почему это происходит

А откуда понятно что ты делаешь с word"om кто его закрывает. Тут только открытие...


 
trubin   (2006-11-24 20:42) [4]


> А откуда понятно что ты делаешь с word"om кто его закрывает.
>  Тут только открытие...

Не понял, я запускаю программу, из структуры TShellExecuteInfo получаю хендл запущенного процесса, и ставлю свой поток на ожидание - waitForSingleObject(ShellExecuteInfo.hProcess, INFINITE);, затем в окне ворда щелкаю по кнопке "Закрыть" и он почему-то виснет, с другими программами этого не происходит, да и ворд в случае если после запуска не использовать waitForSingleObject нормально закрывается.


 
Kolan ©   (2006-11-24 20:50) [5]

Уточняю что я точно ничего не знаю. :) Все что могу.

А с чего ты взял что hProcess окажется в signaled состоянии? Смотри справку:

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.


 
Kolan ©   (2006-11-24 21:05) [6]

Попробуй с CreateProcess

Пример из справки:
void main( VOID )
{
   STARTUPINFO si;
   PROCESS_INFORMATION pi;

   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
   ZeroMemory( &pi, sizeof(pi) );

   // Start the child process.
   if( !CreateProcess( NULL, // No module name (use command line).
       "MyChildProcess", // Command line.
       NULL,             // Process handle not inheritable.
       NULL,             // Thread handle not inheritable.
       FALSE,            // Set handle inheritance to FALSE.
       0,                // No creation flags.
       NULL,             // Use parent"s environment block.
       NULL,             // Use parent"s starting directory.
       &si,              // Pointer to STARTUPINFO structure.
       &pi )             // Pointer to PROCESS_INFORMATION structure.
   )
   {
       ErrorExit( "CreateProcess failed." );
   }

   // Wait until child process exits.
   WaitForSingleObject( pi.hProcess, INFINITE );

   // Close process and thread handles.
   CloseHandle( pi.hProcess );
   CloseHandle( pi.hThread );
}


ЗЫ
 Ты кстати забыл закрыть описатель:
The calling application is responsible for closing the handle when it is no longer needed.


 
trubin   (2006-11-24 21:11) [7]


> А с чего ты взял что hProcess окажется в signaled состоянии?

Дык на ожидание-то он ставится.


> Все что могу.

Спасибо за сочувствие ;)


 
Kolan ©   (2006-11-24 21:43) [8]

На, работает :)
var
 StInfo: TStartupInfo;
 SeAttr: TSecurityAttributes;
 ProcInfo: TProcessInformation;
 ProcHandle: THandle;
begin
 FillChar(StInfo, SizeOf(StInfo), 0);
 StInfo.cb := SizeOf(StInfo);
 StInfo.dwFlags := STARTF_USESHOWWINDOW;
 StInfo.wShowWindow := SW_SHOWDEFAULT;
 with SeAttr do
 begin
   nLength := SizeOf(SeAttr);
   bInheritHandle := True;
   lpSecurityDescriptor := nil;
 end;
 if CreateProcess (
    nil,
    PChar("C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE G:\My_Documents\UMLArticle\UMLArticle.doc"),
    @SeAttr, @SeAttr, false,
    NORMAL_PRIORITY_CLASS,
    nil,
    PChar("c:\windows"),
    StInfo,
    ProcInfo)
 then
 begin
   ProcHandle := ProcInfo.hProcess;
   WaitForSingleObject(ProcHandle, INFINITE);
   ShowMessage("WaitOK");
 end
 else
   ShowMessage("Error");

end;


ЗЫ
Если че я первый раз пользовал CreateProcess, сильно не бить.


 
Kolan ©   (2006-11-24 21:45) [9]

ПОльзовался этим:
http://ldvroot.narod.ru/OS.pdf

Кажеется это кусок Рихтера(которого я все не дочитаю) на русском и на Delphi.


 
Leonid Troyanovsky ©   (2006-11-25 11:45) [10]


> trubin   (24.11.06 19:29)  

>    fMask := SEE_MASK_NOCLOSEPROCESS;


fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;

--
Regards, LVT.


 
trubin   (2006-11-25 20:04) [11]

FINAL POST:

2 Leonid: Большое спасибо! Впредь буду на флаги внимательнее смотреть!

2 Kolan: CreateProcess процесс для меня неудобна, т.к. многое из того, что ShellExecuteEx делает автоматом, пришлось бы делать руками, но еще раз спасибо за желание помочь!



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

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

Наверх




Память: 0.5 MB
Время: 0.057 c
6-1161759501
Ale-xs
2006-10-25 10:58
2007.04.15
Как отправить UDP пакет с другим IP адресом


15-1174368163
Calibr
2007-03-20 08:22
2007.04.15
JavaScript


15-1174238305
Real
2007-03-18 20:18
2007.04.15
Открыть звездочки отображаемые вместо пароля


9-1147745003
Blondin
2006-05-16 06:03
2007.04.15
DirectSound. Как ?


15-1174296023
Чапаев
2007-03-19 12:20
2007.04.15
Как запретить...