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

carter91620 2012-08-21 05:17:38
请大牛们帮我看看为什么我的程序会死在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;
...全文
125 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
carter91620 2012-08-24
  • 打赏
  • 举报
回复
我的问题解决了。
我把 dest : array [0..100] of Char;数组大小改成2或1就成了,另外,读取管道信息直接显示在非主进程内,所以我也没有判断是否管道没有数据的情况。
蓝色光芒 2012-08-22
  • 打赏
  • 举报
回复
ReadFile读管道,管道没数据时,进入等待状态,正常,如果想要不等待,线程中完成或者用Overlapped异步操作.
carter91620 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

?又是你么。。。我帮你顶一下
[/Quote]

上次的问题解决了,当时代码换到另外一个程序里,却又卡死在readFile(),要哭了,怎么可以这样啊。。。。。
hsfzxjy 2012-08-21
  • 打赏
  • 举报
回复
?又是你么。。。我帮你顶一下

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧