Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230358
  • 博文数量: 73
  • 博客积分: 3005
  • 博客等级: 中校
  • 技术积分: 857
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-24 10:11
文章分类

全部博文(73)

文章存档

2014年(2)

2011年(5)

2010年(29)

2009年(32)

2008年(5)

我的朋友

分类:

2009-11-26 01:12:50

function WinExecute(FileName:string;Visibility:Integer=SW_NORMAL):Boolean;   
  {*运行一个文件并立即返回}      

function WinExecAndWait32(FileName:string;Visibility:Integer=SW_NORMAL;ProcessMsg:Boolean=False):Integer; 
Function WinExecExW(CMD,WorkDir:Pchar;Visiable:integer):DWORD; 
  {*运行一个文件并等待其结束}   

function WinExecWithPipe(const CmdLine,Dir:string;slOutput:TStrings;var dwExitCode:Cardinal):Boolean;overload;  
function WinExecWithPipe(const CmdLine,Dir:string;var Output:string;var dwExitCode:Cardinal):Boolean;overload;  
  {*用管道方式在Dir目录执行CmdLine,Output返回输出信息,dwExitCode返回退出码。如果成功返回True   }  
         
        ---  
//   运行一个文件并立即返回  
function WinExecute(FileName:string;Visibility:Integer=SW_NORMAL):Boolean;  
var  
  StartupInfo:TStartupInfo;  
  ProcessInfo:TProcessInformation;  
begin  
  FillChar(StartupInfo,SizeOf(StartupInfo),#0);  
  StartupInfo.cb:=SizeOf(StartupInfo);  
  StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;  
  StartupInfo.wShowWindow:=Visibility;  
  Result:=CreateProcess(nil,PChar(FileName),nil,nil,False,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo);  
end;  
   
//   运行一个文件并等待其结束  
function WinExecAndWait32(FileName:string;Visibility:Integer;ProcessMsg:Boolean):Integer;  
var  
  zAppName:array[0..512] of Char;  
  zCurDir: array[0..255] of Char;  
  WorkDir: string;  
  StartupInfo:TStartupInfo;  
  ProcessInfo:TProcessInformation;  
begin  
  StrPCopy(zAppName,FileName);  
  GetDir(0,WorkDir);  
  StrPCopy(zCurDir,WorkDir);  
  FillChar(StartupInfo,SizeOf(StartupInfo),#0);  
  StartupInfo.cb:=SizeOf(StartupInfo);      
  StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;  
  StartupInfo.wShowWindow:=Visibility;
 
  if not CreateProcess(nil,
          zAppName,    {   pointer   to   command   line   string   }  
          nil,         {   pointer   to   process   security   attributes   }  
          nil,         {   pointer   to   thread   security   attributes   }  
          False,       {   handle   inheritance   flag   }  
          CREATE_NEW_CONSOLE   or  {   creation   flags   }  
          NORMAL_PRIORITY_CLASS,  
          nil,         {   pointer   to   new   environment   block   }  
          nil,         {   pointer   to   current   directory   name   }  
          StartupInfo, {   pointer   to   STARTUPINFO   }  
          ProcessInfo)   then  
    Result   :=   -1 {   pointer   to   PROCESS_INF   }  
  else  
  begin  
    if ProcessMsg then  
    begin  
      repeat  
        Application.ProcessMessages;  
        GetExitCodeProcess(ProcessInfo.hProcess,   Cardinal(Result));  
      until   (Result   <>   STILL_ACTIVE)   or   Application.Terminated;  
    end  
    else  
    begin  
      WaitforSingleObject(ProcessInfo.hProcess,   INFINITE);  
      GetExitCodeProcess(ProcessInfo.hProcess,   Cardinal(Result));  
    end;  
  end;  

end;  

Function WinExecExW(CMD,WorkDir:Pchar;Visiable:integer):DWORD;  
var  
  StartupInfo:TStartupInfo;  
  ProcessInfo:TProcessInformation;  
begin  
  FillChar(StartupInfo,SizeOf(StartupInfo),#0);  
  StartupInfo.cb:=SizeOf(StartupInfo);  
  StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;  
  StartupInfo.wShowWindow:=Visiable;  
  if not CreateProcess(nil,  
                cmd,  
                nil,  
                nil,  
                false,  
                Create_new_console or Normal_priority_class,  
                nil,  
                WorkDir,  
                StartupInfo,  
                ProcessInfo)   then  
    result:=0  
  else  
  begin  
    WaitForSingleObject(Processinfo.hProcess,INFINITE);  
    GetExitCodeProcess(ProcessInfo.hProcess,Result);  
  end;  
end; 
//上面的函数会一直等到执行完再退出
使用:WinExecExW('CMD.exe   /c   c:\myapp\a.cmd','c:\',SW_Hide);   

 

//   用管道方式在Dir目录执行CmdLine,Output返回输出信息,  
//   dwExitCode 返回退出码。如果成功返回 True  
function WinExecWithPipe(const CmdLine,Dir:string;slOutput:TStrings;var dwExitCode:Cardinal):Boolean;  
var  
  HOutRead,   HOutWrite:   THandle;  
  StartInfo:   TStartupInfo;  
  ProceInfo:   TProcessInformation;  
  sa:   TSecurityAttributes;  
  InStream:   THandleStream;  
  strTemp:   string;  
  PDir:   PChar;  
procedure   ReadLinesFromPipe(IsEnd:   Boolean);  
var  
  s: string;  
  ls:TStringList;  
  i: Integer;  
begin  
  if InStream.Position  begin  
    SetLength(s,InStream.Size - InStream.Position);  
    InStream.Read(PChar(s)^, InStream.Size - InStream.Position);  
    strTemp:=strTemp+s;  
    ls:=TStringList.Create;  
    try  
      ls.Text:=strTemp;  
      for i:=0 to ls.Count-2 do  
        slOutput.Add(ls[i]);  
      strTemp:=ls[ls.Count-1];  
    finally  
      ls.Free;  
    end;  
  end;  
   
  if IsEnd and (strTemp<>'') then  
  begin  
    slOutput.Add(strTemp);  
    strTemp:='';  
  end;  
end; 
 
begin  
  dwExitCode:=0;  
  Result:=False;  
  try  
    FillChar(sa,sizeof(sa),0);  
    sa.nLength:=sizeof(sa);  
    sa.bInheritHandle:=True;  
    sa.lpSecurityDescriptor:=nil;  
    InStream:=nil;  
    strTemp:='';  
    HOutRead:=INVALID_HANDLE_VALUE;  
    HOutWrite:=INVALID_HANDLE_VALUE;  
    try  
      Win32Check(CreatePipe(HOutRead,HOutWrite,@sa,0)); 
      FillChar(StartInfo,SizeOf(StartInfo),0);  
      StartInfo.cb:=SizeOf(StartInfo);  
      StartInfo.wShowWindow:=SW_HIDE;  
      StartInfo.dwFlags:=STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW;  
      StartInfo.hStdError:=HOutWrite;  
      StartInfo.hStdInput:=GetStdHandle(STD_INPUT_HANDLE);  
      StartInfo.hStdOutput:=HOutWrite;  
      InStream:=THandleStream.Create(HOutRead);  
      if Dir<>'' then  
         PDir:=PChar(Dir)  
      else  
         PDir:=nil;  
      Win32Check(CreateProcess(nil,   //lpApplicationName:   PChar  
                  PChar(CmdLine),     //lpCommandLine:   PChar  
                  nil,   //lpProcessAttributes:   PSecurityAttributes  
                  nil,   //lpThreadAttributes:   PSecurityAttributes  
                  True,  //bInheritHandles:   BOOL  
                  NORMAL_PRIORITY_CLASS,   //CREATE_NEW_CONSOLE,  
                  nil,  
                  PDir,  
                  StartInfo,  
                  ProceInfo));  
      while WaitForSingleObject(ProceInfo.hProcess,100)=WAIT_TIMEOUT do  
      begin  
        ReadLinesFromPipe(False);  
        Application.ProcessMessages;  
        //if   Application.Terminated   then   break;  
      end;  
      ReadLinesFromPipe(True);  
      GetExitCodeProcess(ProceInfo.hProcess,   dwExitCode);  
      CloseHandle(ProceInfo.hProcess);  
      CloseHandle(ProceInfo.hThread);  
      Result   :=   True;  
    finally  
      if InStream<>nil then InStream.Free;  
      if HOutRead<>INVALID_HANDLE_VALUE then CloseHandle(HOutRead);  
      if HOutWrite<>INVALID_HANDLE_VALUE then CloseHandle(HOutWrite);  
    end;  
  except  
          ;  
  end;  
end;  
        
function WinExecWithPipe(const CmdLine,Dir:string;var Output:string;var dwExitCode:Cardinal):Boolean;  
var  
  slOutput:TStringList;  
begin  
  slOutput:=TStringList.Create;  
  try  
    Result:=WinExecWithPipe(CmdLine,Dir,slOutput,dwExitCode);  
    Output:=slOutput.Text;  
  finally  
    slOutput.Free;  
  end;  
end;  
 

阅读(2512) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~