易语言API取DOS执行结果模块制作

文章目录[隐藏]

511遇见

取DOS执行结果模块源码

.版本 2

.子程序 取DOS执行结果, 文本型, 公开
.参数 dos命令, 文本型
.局部变量 CreatePipe_结构体, SECURITY_ATTRIBUTES, , , CreatePipe_结构体
.局部变量 进程启动信息_CreateProcess, STARTUPINFO, , , 进程启动信息CreateProcess
.局部变量 进程标识符_CreateProcess, PROCESS_INFORMATION, , , 进程标识符_CreateProcess
.局部变量 hRead, 整数型, , , 读取管道数据的文件句柄
.局部变量 hWrite, 整数型, , , 写管道数据的文件句柄
.局部变量 len, 整数型
.局部变量 txt, 字节集
.局部变量 EXIT, 整数型
.局部变量 返回文本, 文本型

' 结构体的大小初始化设置
CreatePipe_结构体.nLength = 12
' 设置安全描述
CreatePipe_结构体.lpSecurityDescriptor = 0
' 确定创建一个新进程时继承返回的句柄,如果为0,那么新进程将不会继承句柄,如果此字段设置为非0的值,那会就会继承该句柄
CreatePipe_结构体.bInheritHandle = 1
' 创建一个匿名管道
CreatePipe (hRead, hWrite, CreatePipe_结构体, 0)
' 应用程序必须初始化
进程启动信息_CreateProcess.cb = 68
' 制定wShowWindow有效
进程启动信息_CreateProcess.dwFlags = 位或 (#STARTF_USESHOWWINDOW, #STARTF_USESTDHANDLES)
' 为0不显示新建进程的主窗口,为1显示
进程启动信息_CreateProcess.wShowWindow = #SW_HIDE
进程启动信息_CreateProcess.hStdOutput = hWrite
进程启动信息_CreateProcess.hStdError = hWrite
' 判断操作系统类型,选择不同cmd
.如果 (取操作系统类别 () ≤ 2)
' 创建一个进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口
CreateProcess (0, “command.com /c ” + dos命令, 0, 0, 真, 0, 0, 0, 进程启动信息_CreateProcess, 进程标识符_CreateProcess)

.否则
CreateProcess (0, “cmd.exe /c ” + dos命令, 0, 0, 真, 0, 0, 0, 进程启动信息_CreateProcess, 进程标识符_CreateProcess)

.如果结束
' 开始CreatePipe (hRead, hWrite, CreatePipe_结构体, 0)创建了一个管道了,现在CreateProcess又创建了一个管道,应当先关闭多余的管道
CloseHandle (hWrite)
' 设立一个无限循环
.判断循环首 (len ≠ -1)
' 查看管道中的是否有数据
PeekNamedPipe (hRead, 0, 0, 0, len, 0)
.如果 (len ≠ 0)
txt = 取空白字节集 (1024)
' 从管道中读取数据
ReadFile (hRead, txt, 1023, len, 0)
返回文本 = 返回文本 + 取字节集数据 (txt, #文本型, )

.否则
' 查看一下指定的进程是否已经结束
GetExitCodeProcess (进程标识符_CreateProcess.hProcess, EXIT)
' 因为有的进程退出了,但管道中还有数据,所以必须在管道中没有数据的情况下判断程序是否已经结束,从而终止循环
.如果真 (EXIT ≠ #STILL_ACTIVE)
' 彻底关闭管道
CloseHandle (hRead)
跳出循环 ()
.如果真结束

.如果结束
' 为了减轻系统的堵塞,
处理事件 ()
' 输出调试文本 (到文本 (len))
.判断循环尾 ()
返回 (返回文本)


发布日期:

所属分类: 编程 标签:  


没有相关文章!