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

Вниз

Запуск другой программы и ожидаение её завершения.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
3-83991
KSergey
2003-05-27 15:27
2003.06.26
Можно ли вставлять комментарии в текст SQL-запроса...


14-84616
Cobalt
2003-06-07 00:48
2003.06.26
Отчет об


3-83947
yura
2003-06-04 09:51
2003.06.26
Backup&Restore


1-84420
Maks Realov
2003-06-09 16:01
2003.06.26
Асинхронное выполнение процедур в своей программе.


14-84723
Mike B.
2003-06-05 14:22
2003.06.26
Реклама на сайте