Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизЗапуск другой программы и ожидаение её завершения. Найти похожие ветки
← →
Shirson (2003-06-11 14:38) [0]Возникла необходимость реализовать следующее:
Из своей программы нужно запустить MSWord, подождать пока пользователь с ним поработает и закроет, и продолжить работу.
Поискал на сайте, вроде нашёл как это сделать.
Пишу
var
h:thandle;
begin
ShellExecute(handle, "open",pchar("c:\delme.doc"),nil,nil,1);
h:=findwindow(nil,"delme - Microsoft Word");
WaitForSingleObject(h,Infinite);
ShowMessage("Done !");
end;
Ворд запускается, вh
падает хендл, а вот WaitForSingleObject технично забивает на всё и прога идёт дальше без задержек.
Просветите в чём грабли?
Или как это организовать по-другому (мне кажетсяh:=findwindow(nil,"delme - Microsoft Word");
не самый правильный путь).
← →
Shirson (2003-06-11 14:57) [1]Хм... попробовал через CreateProcess. Получилось вроде.
Но там требуется указывать полный путь до проги. Т.е. "C:\Program Files\Microsoft Office\Office\winword.exe c:\delme.doc", что есть не очень верно, так как на разных компах ворд может стоять в разных местах.
Как-нибудь поуниверсальнее к нему можно обратиться?
← →
jel (2003-06-11 14:58) [2]
Var
SEI : SHELLEXECUTEINFO;
ZeroMemory(@SEI, SizeOf(SEI));
SEI.cbSize := SizeOf(SEI);
SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
SEI.Wnd := Application.Handle;
SEI.lpFile := pchar(filename);
SEI.nShow := SW_SHOW;
if ShellExecuteEx(@SEI) then begin
repeat
Application.ProcessMessages;
until WaitForSingleObject(SEI.hProcess ,0) = WAIT_OBJECT_0;
end
else ShowMessage("Не удалось запустить");
← →
jel (2003-06-11 15:00) [3]Можно в реестре поискать или файл .doc передать в ShellExecuteEx - если стоит, сам откроется.
← →
han_malign (2003-06-11 15:08) [4]
function WaitExec(const aAppName,aCmdLine: string): DWORD;
var _pi: PROCESS_INFORMATION;
_si: STARTUPINFO;
pc,pc1: PChar;
begin
FillChar(_si,sizeof(_si),0);
_si.cb:=sizeof(_si);
_si.wShowWindow:=SW_SHOWDEFAULT;
FillChar(_pi,sizeof(_pi),0);
if(aAppName="")then pc:=nil else pc:=PChar(aAppName);
if(aCmdLine="")then pc1:=nil else pc:=PChar(aCmdLine);
if(CreateProcess(pc,pc1,nil,nil,false,0,nil,nil,_si,_pi))
then Result:=NO_ERROR else Result:=GetLastError;
if(Result=NO_ERROR)then begin
WaitForSingleObject(_pi.hProcess,INFINITE);
if(not GetExitCodeProcess(_pi.hProcess,Result))then Result:=GetLastError;
CloseHandle(_pi.hProcess);
CloseHandle(_pi.hThread);
end;
end;
← →
kudatsky (2003-06-11 16:28) [5]В библиотеке RxLib есть процедура
FileExecuteWait
← →
Digitman (2003-06-11 17:20) [6]
> Shirson
ключевой момент в ошибке, которую ты поимел в приведенном тобой изначально примере - хэндл окна не является объектом синхронизации, в отличии от хэндла процесса. Отсюда и отказ WaitFor-ф-ции - она требует в кач-ве параметра именно объект синхронизации.
← →
Shirson (2003-06-13 09:16) [7]>jel
Большое спасибо, твой вариант сработал (путь к ворду указывать не потребовалось)
>han_malign
Этот вариант у меня работал, но требовал точного пути.
>kudatsky
Спасибо, не пользуюсь :)
>Digitman
Спасибо, учту на будущее.
← →
Song (2003-06-13 11:44) [8]FindExecutable()
← →
Тих (2003-06-13 12:37) [9]М-да... что-то мне кажется, что у ворда есть неплохая объектная модель с событиями, в частности см. Word.Application OnDocumentChange, OnStartup и OnQuit.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.028 c