Текущий архив: 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