急救:关于delphi 6中的重定向问题

先生 2003-04-26 09:43:55
把tasm编译所产生的信息输入到screen.txt中怎么办??????

我在DELPHI 6 中试了,加了重定向后,tasm不能正常编译。去掉>screen.txt tasm倒能够正常编译。我的语句如下:
winexec('tasm.exe new.asm >screen.txt',9);
{tasm.exe ,new.asm,screen.txt 都在当前目录下}
高手们,帮帮忙,关系到我毕业呀!

...全文
78 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
短歌如风 2003-04-27
  • 打赏
  • 举报
回复
补充:如果程序运行时需要从标准输入输入数据,可以对标准输入也进行重定向:
StInfo.hStdError := StInfo.hStdOutput;
stInfo.hStdIn := hStd;
FlushConsoleInputBuffer(hStd);
然后用WriteFile(hPipe,...)提供输入数据。
在读写管道时读出的数据一定会是另一端写入的数据,用它进行双向数据传递不会产生干扰。
ikumei 2003-04-26
  • 打赏
  • 举报
回复
还有一种取巧的办法.那就是-------用程序在当前目录下新建立一个临时批处理文件如:temp.bat
然后将 'tasm.exe new.asm >screen.txt'写如这个临时批处理
然后用winexec执行这个临时批处理
hsgrass37301 2003-04-26
  • 打赏
  • 举报
回复
在Win2000下,,我试过,,肯定得:

WinExec('cmd.exe /c dir > a.txt',SW_HIDE);
honkily 2003-04-26
  • 打赏
  • 举报
回复
up
先生 2003-04-26
  • 打赏
  • 举报
回复
高手,我一定给你多顶两下!~~~~~~~~~~
短歌如风 2003-04-26
  • 打赏
  • 举报
回复
hsgrass37301(零点)的方法也是一种可行的简单处理办法。不过:
1,不要用WinExec,这个函数是个过时函数,它还存在是为了兼容以前的16位代码。应该改用CreateProcess。如果觉得CreateProcess太麻烦,应该改用ShellAPI中的ShellExecute或ShellExecuteEx。
2,由于Windows系统是多任务的,当你调用一个程序时它不会等到这个程序结束才返回。而如果你想知道执行结果就必须知道这个程序什么时候结束,这样你就必须知道该程序的进程句柄,然后调用WaitForSingleObject(进程句柄).要想得到该程序的进程句柄,就必须用CreateProcess或ShellExecuteEx(这时ShellExecute不行了)运行该程序。
3,使用cmd.exe实现要考虑很多情况。比如搜索路径、在Windows98下的处理等。
短歌如风 2003-04-26
  • 打赏
  • 举报
回复
如果只是为了把输出内容进行处理,而不是为了保存到指定文件中,可以不创建文件而改用管道对象,可以避免磁盘操作这种容易发生异常的动作:
var
StInfo:TStartupInfo;
PrInfo:TProcessInformation;
SecAttr: TSecurityAttributes;
hStd: THandle;
PipeName: String;
Strm: TStream;
hPipe: THandle;
begin
PipeName := Format('\\.\pipe\InPipe%x_%x',[GetCurrentProcessId,Round(Time*24*3600)]);
hPipe := CreateNamedPipe(PChar(PipeName), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE or PIPE_NOWAIT,
PIPE_UNLIMITED_INSTANCES, 4096, 4096,100,nil);
SecAttr.nLength := Sizeof(SecAttr);
SecAttr.lpSecurityDescriptor := nil;
SecAttr.bInheritHandle := True;
ZeroMemory(@StInfo,Sizeof(StInfo));
StInfo.cb := Sizeof(StInfo);
StInfo.dwFlags := STARTF_USESTDHANDLES;
hStd := CreateFile(
PChar(PipeName),
GENERIC_WRITE or GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,
@SecAttr,
OPEN_EXISTING,
0,0);
StInfo.hStdOutput := hStd;
StInfo.hStdError := StInfo.hStdOutput;
FlushConsoleInputBuffer(hStd);
CreateProcess('c:\borland\bcc55\bin\bcc32.exe', nil, nil, nil, True,
CREATE_NO_WINDOW
, nil, nil,StInfo,PrInfo);
WaitforSingleObject(prInfo.hProcess, INFINITE);
CloseHandle(hStd);
Strm := THandleStream.Create(hPipe);
Memo1.Lines.LoadFromStream(Strm);
Strm.Free;
CloseHandle(hPipe);
end;
短歌如风 2003-04-26
  • 打赏
  • 举报
回复
const
FileName = 'c:\output.txt';
var
StInfo:TStartupInfo;
PrInfo:TProcessInformation;
SecAttr: TSecurityAttributes;
hStd: THandle;
begin
SecAttr.nLength := Sizeof(SecAttr);
SecAttr.lpSecurityDescriptor := nil;
SecAttr.bInheritHandle := True;
ZeroMemory(@StInfo,Sizeof(StInfo));
StInfo.cb := Sizeof(StInfo);
StInfo.dwFlags := STARTF_USESTDHANDLES;
hStd := CreateFile(
PChar(FileName),
GENERIC_WRITE or GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,
@SecAttr,
OPEN_ALWAYS,//如果希望每次都重新创建则改为CREATE_ALWAYS
0,0);
StInfo.hStdOutput := hStd;
StInfo.hStdError := StInfo.hStdOutput;
FlushConsoleInputBuffer(hStd);
CreateProcess('c:\borland\bcc55\bin\bcc32.exe', nil, nil, nil, True,
CREATE_NO_WINDOW
, nil, nil,StInfo,PrInfo);
WaitforSingleObject(prInfo.hProcess, INFINITE);
CloseHandle(hStd);
Memo1.Lines.LoadFromFile(FileName);
end;
短歌如风 2003-04-26
  • 打赏
  • 举报
回复
我做过一个重定向的,不过我是重定向到管道,并且又起动了一个线程去监视子进程的退出(因为我是调用cmd.exe,需要在主线程中接受参数并传递给子进程),比较复杂。等我改一改再贴上来。
先生 2003-04-26
  • 打赏
  • 举报
回复
谢谢各位指教。请多多帮忙!

1,184

社区成员

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

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