Главная страница
    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.46 MB
Время: 0.034 c
3-83857
Oldman
2003-06-02 09:42
2003.06.26
Сеть и Clipper.


14-84743
Сатир
2003-06-02 13:18
2003.06.26
Не верьте гороскопам


1-84102
pasha007
2003-06-10 15:53
2003.06.26
Как изменить цвет главного меню?


14-84646
Janus
2003-05-28 17:43
2003.06.26
Дизассемблер


11-84052
Юзер
2002-10-09 23:22
2003.06.26
Что вы думаете о компоненте





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский