Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-84402
kull
2003-06-09 11:09
2003.06.26
FormatDateTime...


3-84019
Alexei Sviridov
2003-05-30 22:41
2003.06.26
Poisk zapisi v Interbase table


1-84327
Igor
2003-06-16 05:29
2003.06.26
Как запустить программу и дождаться ее завершения?


1-84270
Project111
2003-06-14 11:21
2003.06.26
Version info


1-84303
Chainik
2003-06-15 14:02
2003.06.26
OnMouseMove





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский