Delphi 调用CMD命令行,路径包含空格处理方法  
官方Delphi 学习QQ群: 682628230(三千人)
频道

Delphi 调用CMD命令行,路径包含空格处理方法


Delphi 调用CMD命令行,路径包含空格处理方法

//执行CMD命令行并获取返回值
function TLeiDianApi.ExcuteDosCmd(CommandLine: string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of AnsiChar;
  BytesRead: Cardinal;
  Handle: Boolean;
  preTickcount: Integer;
begin
  Result := '';
  with SA do
  begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
  try
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    Handle := CreateProcess(nil,  //lpApplicationName: PChar
      PChar('cmd /c ' + CommandLine),  //lpCommandLine: PChar
      nil, //lpProcessAttributes: PSecurityAttributes
      nil, //lpThreadAttributes: PSecurityAttributes
      True, //bInheritHandles: BOOL
      0, //CREATE_NEW_CONSOLE
      nil, nil, SI, PI);
    CloseHandle(StdOutPipeWrite);
    if Handle then
    try
      preTickcount := GetTickCount;
      repeat
        WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
        if BytesRead > 0 then
        begin
          Buffer[BytesRead] := #0;
          Result := Result + Buffer;
        end;
        if GetTickCount - preTickcount > 10 * 1000 then
        begin
          OutputDebugStringW(PChar('mz:ExcuteDosCmd timeOut'));
          Break;
        end;
      until not WasOK or (BytesRead = 0);
      WaitForSingleObject(PI.hProcess, INFINITE);
    finally
      CloseHandle(PI.hThread);
      CloseHandle(PI.hProcess);
    end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;

//tip:如果路径中包含空格,使用 "" 号即可

//夜神
function TLeiDianApi.KillAppByIndexAndName(index: DWORD; packageName: string): Boolean;
var
  sCmd: string;
  sOut: string;
begin
  sCmd := Format('"%s" killapp -index:%d -packagename:%s', [FConsolePath, index, packageName]);
  sOut := ExcuteDosCmd(sCmd);
  Result := True;
end;

————————————————

来源:https://blog.csdn.net/u011706768/article/details/120498608



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.040832996368408 seconds