在Win98下执行Winexec('D:\bin\tpc D:\1.pas>1.log',sw_SHOW)不能成功.Why?

zhangzetao 2004-05-05 11:13:52
为什么我在Win98下用WinExec('C:\pascal\bin\tpc C:\pascal\bin\simple.pas>1.log',sw_Show)试图把simple编译并将编译信息存入1.log但是tpc就老把>1.log当成是文件名的参数而不是simple.pas,所以老是说找不到文件,可这种情况在WinXp下却不会出现,不知为什么?
如果您知道原因请告诉我谢谢。
...全文
59 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zhangzetao 2004-05-06
感谢ly_liuyang(Liu Yang)给我的提示,我经过一番努力后,终得找到了解答:
procedure TMainForm.RunDosInMemo(const DosApp: string; AMemo: TMemo);
const
{设置ReadBuffer的大小}
ReadBuffer = 2400;
var
Security: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: PChar;
BytesRead: DWord;
Buf: string;
begin
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
{创建一个命名管道用来捕获console程序的输出}
if Createpipe(ReadPipe, WritePipe, @Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start, Sizeof(Start), #0)
{设置console程序的启动属性}
with start do
begin
cb := SizeOf(start);
start.lpReserved := nil;
lpDesktop := nil;
lpTitle := nil;
dwX := 0;
dwY := 0;
dwXSize := 0;
dwYSize := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute := 0;
cbReserved2 := 0;
lpReserved2 := nil;
hStdOutput := WritePipe; //将输出定向到我们建立的WritePipe上
hStdInput := ReadPipe; //将输入定向到我们建立的ReadPipe上
hStdError := WritePipe;//将错误输出定向到我们建立的WritePipe上
dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;//设置窗口为hide
end;

try
{创建一个子进程,运行console程序}
if CreateProcess(nil, PChar(DosApp), @Security, @Security, true,
NORMAL_PRIORITY_CLASS,
nil, nil, start, ProcessInfo) then
begin
{等待进程运行结束}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
{关闭输出...开始没有关掉它,结果如果没有输出的话,程序死掉了。}
CloseHandle(WritePipe);
Buf := '';
{读取console程序的输出}
repeat
BytesRead := 0;
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
Buf := Buf + string(Buffer);
until (BytesRead < ReadBuffer);

AMemo.Lines.Add(Buf);

end;
finally
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
end;
end;
end;

通过createPipe管道,把Dos下的信息输出到Memo中。
  • 打赏
  • 举报
回复
zhangzetao 2004-05-05
那为什么在XP上却可以呢?
  • 打赏
  • 举报
回复
zhangzetao 2004-05-05
我暂时无MSDN,请您给我简单说明一下好吗?谢谢。
  • 打赏
  • 举报
回复
ly_liuyang 2004-05-05
当然了
WinExec不是DOS方式的

可以使用CreatePipe的管道技术处理Console的输出内容,详细的参看MSDN和Google上的相关文档
  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi
加入

4972

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2004-05-05 11:13
社区公告
暂无公告