Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как запустить из АПИ досовскую команду?


Автор: Cyri 6.12.2004, 11:14
Как запустить из АПИ досовскую команду, а управление оставить в окне приложения. Т.е. чтобы можно было ввести время запуска команды, остановить выполенине нажатием кнопки, просмотреть результат выполнеиня в Мемо-поле, завершить приложение и т.д. Объясните на примере команды Dir. Надо иметь возможность задавания времени выполения (начала работы) и передавать данные в файл. Только подробно.
Заранее спасибо. Кирилл.

Автор: Song 6.12.2004, 12:51
Cyri
Код

ShellExecute(Handle,nil,'cmd.exe',...)

Автор: Alex 6.12.2004, 14:53
Cyri DRKB->Системные функции и WinAPI->Работа с чужими процессами->Как вывести результат работы консоли в Memo?

Автор: Girder 6.12.2004, 18:13
К примеру вот так:
Код
function RunCommand(const Command,Dir:string; Lines:TStrings; var CaretPos:TPoint):boolean;
var StartUpInfo:TStartupInfo;
   ProcessInfo:TProcessInformation;
   PrConsole:String;
   pRead,pWrite,Bytes,r:cardinal;
   s:string;
   sAttr:TSecurityAttributes;
   pDir:PChar;
begin
Result:=false;
sAttr.nLength:=SizeOf(SECURITY_ATTRIBUTES);
sAttr.bInheritHandle:=true;
sAttr.lpSecurityDescriptor:=nil;
if DWord(CreatePipe(pRead,pWrite,@sAttr,0))=0 then Exit;
FillChar(StartUpInfo,SizeOf(TStartUpInfo),0);
StartUpInfo.cb:=SizeOf(TStartUpInfo);
StartUpInfo.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow:=SW_Hide;
StartUpInfo.hStdOutput:=pWrite;
StartUpInfo.hStdError:=pWrite;
PrConsole:='cmd.exe';
s:=Trim(Command);
if s<>'' then PrConsole:=PrConsole+' /K '+s;
pDir:=nil;
if trim(Dir)<>'' then pDir:=PChar(Dir);
if CreateProcess(nil,PChar(PrConsole),nil,nil,true,NORMAL_PRIORITY_CLASS,nil,pDir,StartUpInfo,ProcessInfo) then
 begin
  WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(ProcessInfo.hProcess);
  PeekNamedPipe(pRead,nil,0,nil,@Bytes,nil);
  if Bytes<>0 then
   begin
    SetLength(s,Bytes);
    ReadFile(pRead,PChar(s)^,Length(s),r,nil);
    OemToChar(PChar(s),PChar(s));
    Lines.Add(s);
    CaretPos:=Point(Length(trim(Lines.Strings[Lines.Count-1])),Lines.Count-1);
    SetLength(s,0);
    Result:=true;
   end;
 end;
end;


Во вложение пример использования данной функции... Ты можеш работать с Memo как буд-то ты в окне сессии Dos, т.е. вводить команды: dir, cd \, запускать приложения и т.д.

PS: Кое-что мне было лень делать... но думаю что идея будет ясна smile

Удачи.

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