文章目录[隐藏]
我们先在程序集中测试调用,然后封装成模块,本课示范了程序集取DOS执行结果。用到的API在上课以及录制发布。
程序集源码
.版本 2
.程序集 窗口程序集_启动窗口
.程序集变量 CreatePipe_结构体, SECURITY_ATTRIBUTES, , , CreatePipe_结构体
.程序集变量 进程启动信息_CreateProcess, STARTUPINFO, , , 进程启动信息CreateProcess
.程序集变量 进程标识符_CreateProcess, PROCESS_INFORMATION, , , 进程标识符_CreateProcess
.程序集变量 hRead, 整数型, , , 读取管道数据的文件句柄
.程序集变量 hWrite, 整数型, , , 写管道数据的文件句柄
.程序集变量 len, 整数型
.程序集变量 txt, 字节集
.程序集变量 EXIT, 整数型
.子程序 _按钮1_被单击
编辑框1.内容 = “”
' 结构体的大小初始化设置
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 ” + 编辑框2.内容, 0, 0, 真, 0, 0, 0, 进程启动信息_CreateProcess, 进程标识符_CreateProcess)
.否则
CreateProcess (0, “cmd.exe /c ” + 编辑框2.内容, 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)
编辑框1.内容 = 编辑框1.内容 + 取字节集数据 (txt, #文本型, )
.否则
' 查看一下指定的进程是否已经结束
GetExitCodeProcess (进程标识符_CreateProcess.hProcess, EXIT)
' 因为有的进程退出了,但管道中还有数据,所以必须在管道中没有数据的情况下判断程序是否已经结束,从而终止循环
.如果真 (EXIT ≠ #STILL_ACTIVE)
' 彻底关闭管道
CloseHandle (hRead)
.如果真结束
.如果结束
' 为了减轻系统的堵塞,
处理事件 ()
输出调试文本 (到文本 (len))
.判断循环尾 ()
优酷土豆链接:511遇见易语言模块API教程-36-取DOS执行结果程序
优酷全部教程播单:http://i.youku.com/i/UNTU3NDYyODg0/playlists
交流群:521068947
本人QQ: 272586593