
21.07.2011, 17:02
|
 |
Модератор
|
|
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
|
|
Лови модуль, буквально вчера писал. Точно знаю что работает на Delphi XE, про остальные версии 100% утверждать не берусь, но теоретически работать должно.
Код:
unit ConsoleAppRunner;
interface
uses
Classes;
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);
implementation
uses
Windows,AnsiStrings;
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);
var
securityattributes: TSecurityAttributes;
startupinfo: TStartupInfoA;
processinformation: TProcessInformation;
hPipeInputRead: THandle;
hPipeInputWrite: THandle;
hPipeOutputRead: THandle;
hPipeOutputWrite: THandle;
WaitResult:Cardinal;
buf: array [0..1023] of AnsiChar;
dummy: Cardinal;
begin
OutStrings.Append(#13#10);
securityattributes.nLength:=SizeOf(TSecurityAttributes);
securityattributes.lpSecurityDescriptor:=nil;
securityattributes.bInheritHandle:=True;
CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
ZeroMemory(@processinformation, SizeOf(TProcessInformation));
startupinfo.cb:=SizeOf(TStartupInfo);
startupinfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
startupinfo.wShowWindow:=SW_HIDE;
startupinfo.hStdInput:=hPipeInputRead;
startupinfo.hStdOutput:=hPipeOutputWrite;
startupinfo.hStdError:=hPipeOutputWrite;
OutStrings.BeginUpdate;
OutStrings.Append(CmdLine+' '+Params);
OutStrings.EndUpdate;
if CreateProcessA(nil, PAnsiChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
nil, PAnsiChar(AnsiStrings.ExtractFileDir(CmdLine)), startupinfo, processinformation) then
begin
repeat
WaitResult:=WaitForSingleObject(processinformation.hProcess, 100);
if ReadFile(hPipeOutputRead, buf, Length(buf), dummy, nil) then
begin
OemToAnsiBuff(buf, buf, dummy);
OutStrings.BeginUpdate;
OutStrings.Text:=OutStrings.Text+Copy(buf, 1, dummy);
OutStrings.EndUpdate;
end;
until WaitResult<>WAIT_TIMEOUT;
CloseHandle(processinformation.hProcess);
end;
CloseHandle(hPipeInputWrite);
CloseHandle(hPipeInputRead);
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeOutputRead);
end;
end.
Параметры:
CmdLine - exe-файл (указываем полный путь, далее этот путь будет использоваться как рабочий каталог)
Params - параметры
OutStrings - объект для вывода результатов (в самом простом варианте это Memo1.Lines)
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.
Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
|