首页
社区
课程
招聘
请教,如果获得 ML.exe 的输出信息?
发表于: 2006-3-17 20:21 5700

请教,如果获得 ML.exe 的输出信息?

2006-3-17 20:21
5700
请问像ml.exe,link.exe这样基于控制台的程序,能不能得到执行后在控制台显示的信息?尤其是错误所在的行号
我想自己写一个汇编的IDE

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
可以使用管道来获取ml.exe的输出信息
2006-3-17 21:01
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最初由 thebutterfly 发布
可以使用管道来获取ml.exe的输出信息

可不可以讲详细一些?最好举个例子!
谢谢!
2006-3-17 21:41
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4
管道属于进程间通信方式。
主要有匿名管道和命名管道两种。
一般在核心编程之类的书籍中出现

原本正打算这两天写篇关于这方面的文章,
只可惜一直没有时间
2006-3-17 23:05
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
管道是windows环境下进程之间相互通信的手段之一,它实际上是一段共享的内存区,进程把共享消息放在那里。并通过一些 API 提供信息交换。管道是两个头的东西,每个头各连接一个进程或者同一个进程的不同代码。使用管道的好处在于:读写它使用的是对文件操作的 api,结果操作管道就和操作文件一样。即使你在不同的计算机之间用命名管道来通信,你也不必了解和自己去实现网络间通信的具体细节。
命名管道是由服务器端的进程建立的,管道的命名必须遵循特定的命名方法,就是 "\\.\pipe\管道名",当作为客户端的进程要使用时,使用"\\计算机名\\pipe\管道名" 来打开使用,具体步骤如下:

服务端通过函数 CreateNamedPipe 创建一个命名管道的实例并返回用于今后操作的句柄,或为已存在的管道创建新的实例。
服务端侦听来自客户端的连接请求,该功能通过 ConnectNamedPipe 函数实现。
客户端通过函数 WaitNamedPipe 来等待管道的出现,如果在超时值变为零以前,有一个管道可以使用,则 WaitNamedPipe 将返回 True,并通过调用 CreateFile 或 CallNamedPipe 来呼叫对服务端的连接。
此时服务端将接受客户端的连接请求,成功建立连接,服务端 ConnectNamedPipe 返回 True建立连接之后,客户端与服务器端即可通过 ReadFile 和 WriteFile,利用得到的管道文件句柄,彼此间进行信息交换。
当客户端与服务端的通信结束,客户端调用 CloseFile,服务端接着调用 DisconnectNamedPipe。最后调用函数CloseHandle来关闭该管道。

一个控制台有三个句柄:标准输入、标准输出和和标准错误句柄,标准输入、标准输出句柄是可以重新定向的,你可以用匿名管道来代替它,这样一来,你可以在管道的另一端用别的进程来接收或输入,而控制台一方并没有感到什么不同,就象 Dos 下的 > 或者 < 可以重新定向输出或输入一样。通常控制台程序的输入输出如下:

(控制台进程output) write ----> 标准输出设备(一般是屏幕)
(控制台进程input) read <---- 标准输入设备(一般是键盘)

而用管道代替后:

(作为子进程的控制台进程output) write ----> 管道1 ----> read (父进程)
(作为子进程的控制台进程input) read <----> 管道2 <---- write (父进程)

使用匿名管道的步骤如下:

使用 CreatePipe 建立两个管道,得到管道句柄,一个用来输入,一个用来输出
准备执行控制台子进程,首先使用 GetStartupInfo 得到 StartupInfo
使用第一个管道句柄代替 StartupInfo 中的 hStdInput,第二个代替 hStdOutput、hStdError,即标准输入、输出、错误句柄
使用 CreateProcess 执行子进程,这样建立的子进程输入和输出就被定向到管道中
父进程通过 ReadFile 读第二个管道来获得子进程的输出,通过 WriteFile 写第一个管道来将输入写到子进程
父进程可以通过 PeekNamedPipe 来查询子进程有没有输出
子进程结束后,要通过 CloseHandle 来关闭两个管道。

节选自罗云彬的win32汇编教程
2006-3-17 23:06
0
雪    币: 202
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个是Radasm里面的一个编辑控件的使用例子,你可以好好研究一下
http://www.radasm.com/projects/MasmEd.zip
2006-3-18 10:43
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常非常感谢!!
2006-3-18 18:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
一个比较笨的方法:
在命令行参数后加上“>fielname.tmp”(引号不要加),"filename.tmp"可以取任意名字,还可以加上路径,运行过后"ml.exe"、“link.exe”等的控制台输出就被重定向到了文件filename.tmp里,然后再从文件“filename.tmp”里读取。

其实这也是间接利用了管道(pipe)!
2006-3-19 20:42
0
游客
登录 | 注册 方可回帖
返回
//