首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

还是ReadFile函数的有关问题,请大牛帮帮忙。

2013-01-01 
还是ReadFile函数的问题,请大牛帮帮忙。。。。请大牛们帮我看看为什么我的程序会死在ReadFile。纠结死了,快哭了

还是ReadFile函数的问题,请大牛帮帮忙。。。。
请大牛们帮我看看为什么我的程序会死在ReadFile。纠结死了,快哭了都。。。。。


function IsWindowsNT: BOOL;
var
  osv : OSVERSIONINFO;
begin
  osv.dwOSVersionInfoSize := SizeOf(osv);
  GetVersionEx(osv);
  if osv.dwPlatformId = VER_PLATFORM_WIN32_NT then
  begin
    Result := True;
  end
  else
  begin
    Result := False;
  end;
end;
procedure TfrmBMain.ExecuteBack(const CommandLine : string);
var
  sa         : TSecurityAttributes;
  sd         : SECURITY_DESCRIPTOR;
  lpsa       : PSecurityAttributes;
  hReadPipe  : THandle;
  hWritePipe : THandle;
  si         : TStartupInfo;
  pi         : TProcessInformation;
  dest       : array [0..100] of Char;
  BytesRead  : DWORD;
  strString  : string;
begin
  lpsa   := nil;
  try
    if (IsWindowsNT) then
    begin
      InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
      SetSecurityDescriptorDacl(@sd,True,nil,False);
      sa.nLength              := SizeOf(SECURITY_ATTRIBUTES);
      sa.bInheritHandle       := True;
      sa.lpSecurityDescriptor := @sd;
      lpsa                    := @sa;
    end;
    Assert(CreatePipe(hReadPipe,hWritePipe,lpsa,2500000));
    GetStartupInfo(si);
    si.cb          := SizeOf(TStartupInfo);
    si.dwFlags     := STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES;
    si.wShowWindow := SW_HIDE;
    si.hStdOutput  := hWritePipe;
    si.hStdError   := hWritePipe;
    CreateProcess(
                  nil,
                  PChar(CommandLine),
                  nil,  nil,   True,
                  0,    nil,   nil,
                  si,   pi
    );
    CloseHandle(pi.hThread);
    WaitForSingleObject(pi.hProcess,0);
    while True do


    begin
      if not PeekNamedPipe(hReadPipe,@dest,SizeOf(dest),nil,nil,nil) then Break;
      if ReadFile(hReadPipe, dest, SizeOf(dest), BytesRead, nil) = True then
      begin
        strString :=  Copy(string(dest),1,BytesRead);
        ShowMessage(strString);
        if Length(strString) < SizeOf(dest) then Break;
      end;
      Sleep(200);
      Application.ProcessMessages;
    end;
    CloseHandle(hWritePipe);
    CloseHandle(hReadPipe);
    Closehandle(pi.hProcess);
  except
    ;
  end;
end;


[解决办法]
?又是你么。。。我帮你顶一下
[解决办法]
ReadFile读管道,管道没数据时,进入等待状态,正常,如果想要不等待,线程中完成或者用Overlapped异步操作.

热点排行