Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Что-то типа system()


Автор: asdf 25.9.2004, 20:43
Значит, нужно запустить консольный exe из окна. Было бы чЮдесно, если б:
0. я знал как вообще его вызвать biggrin.gif
1. окно ждало завершения исполнения exe.
2. после завершения exe окно было активным.
3. окно было активным при исполнении exe.
4. консольное окно вообще не появлялось.
qstn.gif

Автор: Ripper 25.9.2004, 20:52
Ненаю тока как сделать чтобы программа ждала завершения...ну можеш палзу поставить .
Код

uses shellapi;

...
ShellExecute(Handle,'open','c:\myconsoleprog.exe',nil,nil SW_HIDE)

Сделать окно проги активным - SetFocus;

Автор: asdf 25.9.2004, 22:23
thx, Ripper

хммм, а как паузу поставить?

Автор: Ripper 25.9.2004, 22:46
sleep()

Автор: maxim1000 26.9.2004, 00:06
чтобы ждать окончания процесса, нужно создать егос помощью CreateProcess
эта функция возвращает handle нового процесса
потом можно использовать функцию WaitForSingleObject для ожидания окончания процесса
пример создания процесса: MSDN::PlatformSDK::Base Services::DLLs,Processes and Threads
работа с ожидаемыми объектами ...::Base Services::Synchronization

Автор: asdf 27.9.2004, 18:57
Цитата
чтобы ждать окончания процесса, нужно создать егос помощью CreateProcess
эта функция возвращает handle нового процесса
потом можно использовать функцию WaitForSingleObject для ожидания окончания процесса
пример создания процесса: MSDN::PlatformSDK::Base Services::DLLs,Processes and Threads
работа с ожидаемыми объектами ...::Base Services::Synchronization

MSDN нет bored.gif


sample.gif

Автор: maxim1000 27.9.2004, 19:00
http://msdn.microsoft.com

Автор: asdf 27.9.2004, 19:23
56kbps =)))))))))))))))))))))))))))))))))))))))))))))))))))))))

Автор: maxim1000 27.9.2004, 19:28
не надо его качать
там можно посмотреть интересующий раздел в on-line

Автор: asdf 27.9.2004, 20:06
мммммдддддааааа sad.gif
Delphi 5 не соответствует ANSI C



перевести ннннннииии ммммммммааааааааггггггггггууууууууууууу T_T

Автор: p0s0l 27.9.2004, 20:38
Цитата
0. я знал как вообще его вызвать
1. окно ждало завершения исполнения exe.


Качай DRKB - пригодится!
Это оттудава:

Как запустить программу и подождать ее завершения?
Код

Автор: Fabrнcio Fadel Kammer

Пример показывает как из Вашей программы запустить внешнее приложение и подождать его завершения.

function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export;  
var  
 StartInfo: TStartupInfo;  
 ProcInfo: TProcessInformation;  
 CmdLine: ShortString;  
begin  
 { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }  
 CmdLine := '"' + Filename + '" ' + Params;  
 FillChar(StartInfo, SizeOf(StartInfo), #0);  
 with StartInfo do  
 begin  
   cb := SizeOf(StartInfo);  
   dwFlags := STARTF_USESHOWWINDOW;  
   wShowWindow := WinState;  
 end;  
 Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,  
                         CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,  
                         PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);  
 { Ожидаем завершения приложения }  
 if Result then  
 begin  
   WaitForSingleObject(ProcInfo.hProcess, INFINITE);  
   { Free the Handles }  
   CloseHandle(ProcInfo.hProcess);  
   CloseHandle(ProcInfo.hThread);  
 end;  
end;  


А вот пример вызова этой функции:

ExecAndWait( 'C:\windows\calc.exe', '', SW_SHOWNORMAL)  

Параметр FileName = Имя внешней программы.
Параметр Params = Параметры, необходимые для запуска внешней программы
Параметр WinState = Указывает - как будет показано окно:
Для этого параметра мы можем так же использовать следующие константы:
SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_SHOWNORMAL

Взято с Исходников.ru http://www.sources.ru



Цитата
после завершения exe окно было активным.

Делай SetForegroundWindow (Form1.Handle) после того, как консольное приложение окончило работу (после WaitForSingleObject).

Цитата
4. консольное окно вообще не появлялось.

Делай ExecAndWait с параметром SW_HIDE - пример:
Код
ExecAndWait( 'c:\windows\system32\cmd.exe', '', SW_HIDE)



Автор: asdf 4.10.2004, 17:31
Делал всё через ExecAndWait с параметром SW_HIDE:
под WinXP всё работало, под Win2000 - exe из под C++ Builder 5.0 идут, а сделанные, как я понял, в Turbo C++ 3.0, показывают окно при исполнении sad.gif
что делать?
qstn.gif

Автор: asdf 4.10.2004, 20:14
Может это быть из-за ограниченных привилегий? qstn.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)