DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: laidabin
今日帖子: 3
在线用户: 23
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2019/3/18 14:19:53
标题:
执行CreateProcess后WaitForSingleObject一直反馈258超时是怎么回事? 浏览:3228
加入我的收藏
楼主: 通过CreateProcess 调用cmd.exe来执行一个导出数据库数据的脚本。
下面这段代码在Win XP下都能执行没任何问题,
但在Win10下就有问题,在Win10下WaitForSingleObject每次反馈给wrResult的结果都是258(WAIT_TIMEOUT=258)。一直跳不出循环。

我用的Delphi XE

各位这是怎么回事?应该怎么修改?
代码如下:

procedure ReturnCommandResult(const Command :string; var ItemList :TStringList);
var
  hReadPipe: THandle;
  hWritePipe: THandle;
  SI: TStartUpInfo;
  PI: TProcessInformation;
  SA: TSecurityAttributes;
  BytesRead: DWORD;
  Dest: array[0..32767] of char;
  CmdLine: array[0..512] of char;
  Avail, ExitCode, wrResult: DWORD;
  osVer: TOSVERSIONINFO;
  tmpstr: AnsiString;
  Line: string;
  CommandHead :string;
  sCommand :string;
begin
  sCommand :=Lowercase(Command);

  SA.nLength := SizeOf(SA);
  SA.lpSecurityDescriptor := nil;
  SA.bInheritHandle := True;
  CreatePipe(hReadPipe, hWritePipe, @SA, 0);

  try
    FillChar(SI, SizeOf(SI), 0);
    SI.cb := SizeOf(TStartUpInfo);
    SI.wShowWindow := SW_HIDE;
    SI.dwFlags := STARTF_USESHOWWINDOW;
    SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;
    SI.hStdOutput := hWritePipe;
    SI.hStdError := hWritePipe;

    sCommand :='cmd.exe /c '+Command;
    StrPCopy(CmdLine, sCommand);

    if CreateProcess(nil, CmdLine, nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
      begin
        ExitCode := 0;

        while ExitCode = 0 do
          begin
          wrResult := WaitForSingleObject(PI.hProcess, 1000);

          if PeekNamedPipe(hReadPipe, @Dest[0], 32768, @Avail, nil, nil) then
          begin
          if Avail > 0 then
          begin
          try
          FillChar(Dest, SizeOf(Dest), 0);
          ReadFile(hReadPipe, Dest[0], Avail, BytesRead, nil);
          TmpStr := Copy(Dest, 0, BytesRead - 1);
          Line := Line + TmpStr;
          except
          end;
          end;
          end;
          if wrResult<>WAIT_TIMEOUT then
          ExitCode := 1;
          end;
        GetExitCodeProcess(PI.hProcess, ExitCode);
        CloseHandle(PI.hProcess);
        CloseHandle(PI.hThread);
      end;
  finally
    ShowMessage('a');
    if Line = '' then
     Line :='命令没有输出回应!';
    ItemList.Text := Line;
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);
  end;
end;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行523.4375毫秒 RSS