Главная страница
    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
8-84451
korepan
2003-03-12 15:02
2003.06.26
Народ, помогите с Opengl


14-84676
Антон
2003-06-10 16:54
2003.06.26
Подскажите пожалуйста, где найти компонент


1-84384
Aiax
2003-06-09 12:45
2003.06.26
Генерация случайных чисел без повторов


1-84298
X-Man
2003-06-14 18:33
2003.06.26
Hint


3-83989
Екатерина
2003-05-29 12:54
2003.06.26
Утечка памяти при работе с DOA





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