开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 150|回复: 15
收起左侧

[易语言] 取DOS返回值,返回进程ID

[复制链接]
结帖率:84% (26/31)
发表于 4 小时前 | 显示全部楼层 |阅读模式   广东省广州市
200精币
  
子程序名返回值类型公开备 注
取DOS返回文本1文本型 取出一个dos命令的返回信息。可设置即时回显。注意:该命令会阻塞,[返回值]一直到cmd中的内容执行完毕后才会返回。[取自超级模块]
参数名类 型参考可空数组备 注
命令行文本文本型欲执行的命令行文本
即时回显子程序指针DOS即时回显信息回调函数 回调DOS函数(回显信息) 返回逻辑值,真:停止,假:继续
变量名类 型静态数组备 注
SECURITY_ATTRIBUTESSECURITY_ATTRIBUTES 
STARTUPINFOSTARTUPINFO_短整数 
PROCESS_INFORMATION_进程结构 
txt字节集 
len整数型 
hWrite整数型 
hRead整数型 
EXIT整数型 
返回值文本型 
临时文本型 
参数整数型1
如果真 (命令行文本 = “”)
返回 (“”)

SECURITY_ATTRIBUTES.nLength = 12
SECURITY_ATTRIBUTES.lpSecurityDescriptor = 0
SECURITY_ATTRIBUTES.bInheritHandle = 1
CreatePipe (hRead, hWrite, SECURITY_ATTRIBUTES, 0)  ' 创建一个CMD匿名管道
STARTUPINFO.cb = 68
STARTUPINFO.dwFlags = 位或 ( #STARTF_USESHOWWINDOW, #STARTF_USESTDHANDLES )
STARTUPINFO.wShowWindow = #SW_HIDE
STARTUPINFO.hStdOutput = hWrite
STARTUPINFO.hStdError = hWrite
如果 (取操作系统类别 () ≤ 2)
_创建新进程_短整数 (0, “command.com /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口
_创建新进程_短整数 (0, “cmd.exe /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口

_关闭对象 (hWrite)  ' 因为我们开始已经创建了一个写管道端口,现在进程创键时又自动创键了一个写管道端口,所以应关闭多余的管道写端口
判断循环首 (len ≠ -1)  ' 制造一个无限循环
PeekNamedPipe (hRead, 0, 0, 0, len, 0)  ' 查看管道中是否有数据
如果 (len ≠ 0)
txt = 取空白字节集 (1024)
_读出文件中数据 (hRead, txt, 1023, len, 0)  ' 从管道中读取数据
临时 = 取字节集数据 (txt, #文本型, )
如果真 (是否为空 (即时回显))
参数 [1]_取指针_文本型 (临时, 临时, 0)
如果真 (_动态调用子程序 ( #动态调用代码, 即时回显, 参数, 1, ))
' ====图片字节集: #动态调用代码 ==== API动态调用子程序
' *** 缩略程序块 ***
' 动态调用代码 =  {85,139,236,86,139,117,16,141,78,255,133,201,124,21,139,69,12,141,4,136,65,139,16,137,85,16,255,117,16,131,232,4,73,117,242,255,85,8,137,69,12,139,69,20,133,192,116,13,141,4,181,0,0,0,0,137,69,16,3,101,16,139,69,12,94,93,194,16,0}
' 【汇编码】:
' push ebp
' mov ebp, esp
' push esi
' mov esi, dword ptr [ebp+10h]
' lea ecx, dword ptr [esi-01h]
' test ecx, ecx
' jl Label1
' mov eax, dword ptr [ebp+0Ch]
' lea eax, dword ptr [eax+ecx*4]
' inc ecx
' Label2:
' mov edx, dword ptr [eax]
' mov dword ptr [ebp+10h], edx
' push dword ptr [ebp+10h]
' sub eax, 04h
' dec ecx
' jne Label2
' Label1:
' call dword ptr [ebp+08h]
' mov dword ptr [ebp+0Ch], eax
' mov eax, dword ptr [ebp+14h]
' test eax, eax
' je Label3
' lea eax, dword ptr [00000000h+esi*4]
' mov dword ptr [ebp+10h], eax
' add esp, dword ptr [ebp+10h]
' Label3:
' mov eax, dword ptr [ebp+0Ch]
' pop esi
' pop ebp
' retn 0010h
_关闭对象 (hRead)
跳出循环 ()

返回值 = 返回值 + 临时
_取中断进程退出代码 (PROCESS_INFORMATION.进程句柄, EXIT)  ' 查看指定进程是否已结束
如果真 (EXIT ≠ #STILL_ACTIVE )  ' 因为会有程序退出来了,但管道中还有数据的情况,所以必须在管道中没有数据的情况下判断程序是否已结束,这时才能中止循环!
_关闭对象 (hRead)  ' 关闭管道
跳出循环 ()

处理事件 ()
判断循环尾 ()
返回 (返回值)


这个代码取自论坛大佬的代码,返回值是返回全部的DOS,想给他改成DOS返回用即时回显,子程序返回进程ID,要怎么改?


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:60% (3/5)

签到天数: 22 天

发表于 4 小时前 | 显示全部楼层   广西壮族自治区柳州市
即时回显 这是个回调指针啊,不是返回的值
PID应该在创建进程时最后一个参数PROCESS_INFORMATION结构里返回
回复

使用道具 举报

结帖率:84% (26/31)

签到天数: 15 天

 楼主| 发表于 4 小时前 | 显示全部楼层   美国
dnxl 发表于 2024-10-22 13:02
即时回显 这是个回调指针啊,不是返回的值
PID应该在创建进程时最后一个参数PROCESS_INFORMATION结构里返回 ...

即时会显显示的是DOS,他这个是即时会显返回了一遍,子程序又返回了一遍,我想把子程序的返回改成进程ID
回复

使用道具 举报

结帖率:60% (3/5)

签到天数: 22 天

发表于 4 小时前 | 显示全部楼层   广西壮族自治区柳州市
向月亮道晚安 发表于 2024-10-22 13:04
即时会显显示的是DOS,他这个是即时会显返回了一遍,子程序又返回了一遍,我想把子程序的返回改成进程ID ...

那你把返回类型改整数,最后返回PROCESS_INFORMATION.ProcessID不就行了

补充内容 (2024-10-22 13:06):
也就是返回结构体第三个成员
回复

使用道具 举报

签到天数: 20 天

发表于 4 小时前 | 显示全部楼层   四川省宜宾市
  
子程序名返回值类型公开备 注
取DOS返回文本1整数型 取出一个dos命令的返回信息。可设置即时回显。注意:该命令会阻塞,[返回值]一直到cmd中的内容执行完毕后才会返回。[取自超级模块]
参数名类 型参考可空数组备 注
命令行文本文本型欲执行的命令行文本
即时回显子程序指针DOS即时回显信息回调函数 回调DOS函数(回显信息) 返回逻辑值,真:停止,假:继续
变量名类 型静态数组备 注
SECURITY_ATTRIBUTESSECURITY_ATTRIBUTES 
STARTUPINFOSTARTUPINFO_短整数 
PROCESS_INFORMATION_进程结构 
txt字节集 
len整数型 
hWrite整数型 
hRead整数型 
EXIT整数型 
返回值文本型 
临时文本型 
参数整数型1
进程ID整数型 
如果真 (命令行文本 = “”)
返回 (“”)

SECURITY_ATTRIBUTES.nLength = 12
SECURITY_ATTRIBUTES.lpSecurityDescriptor = 0
SECURITY_ATTRIBUTES.bInheritHandle = 1
CreatePipe (hRead, hWrite, SECURITY_ATTRIBUTES, 0)  ' 创建一个CMD匿名管道
STARTUPINFO.cb = 68
STARTUPINFO.dwFlags = 位或 ( #STARTF_USESHOWWINDOW, #STARTF_USESTDHANDLES )
STARTUPINFO.wShowWindow = #SW_HIDE
STARTUPINFO.hStdOutput = hWrite
STARTUPINFO.hStdError = hWrite
如果 (取操作系统类别 () ≤ 2)
进程ID=_创建新进程_短整数 (0, “command.com /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口
进程ID=_创建新进程_短整数 (0, “cmd.exe /c ” + 命令行文本, 0, 0, 真, 0, 0, 0, STARTUPINFO, PROCESS_INFORMATION)  ' 创建一个新进程,并且设置读写管道,创建成功后,进程会自动再创建一个写管道端口

_关闭对象 (hWrite)  ' 因为我们开始已经创建了一个写管道端口,现在进程创键时又自动创键了一个写管道端口,所以应关闭多余的管道写端口
判断循环首 (len ≠ -1)  ' 制造一个无限循环
PeekNamedPipe (hRead, 0, 0, 0, len, 0)  ' 查看管道中是否有数据
如果 (len ≠ 0)
txt = 取空白字节集 (1024)
_读出文件中数据 (hRead, txt, 1023, len, 0)  ' 从管道中读取数据
临时 = 取字节集数据 (txt, #文本型, )
如果真 (是否为空 (即时回显))
参数 [1]_取指针_文本型 (临时, 临时, 0)
如果真 (_动态调用子程序 ( #动态调用代码, 即时回显, 参数, 1, ))
' ====图片字节集: #动态调用代码 ==== API动态调用子程序
' *** 缩略程序块 ***
' 动态调用代码 =  {85,139,236,86,139,117,16,141,78,255,133,201,124,21,139,69,12,141,4,136,65,139,16,137,85,16,255,117,16,131,232,4,73,117,242,255,85,8,137,69,12,139,69,20,133,192,116,13,141,4,181,0,0,0,0,137,69,16,3,101,16,139,69,12,94,93,194,16,0}
' 【汇编码】:
' push ebp
' mov ebp, esp
' push esi
' mov esi, dword ptr [ebp+10h]
' lea ecx, dword ptr [esi-01h]
' test ecx, ecx
' jl Label1
' mov eax, dword ptr [ebp+0Ch]
' lea eax, dword ptr [eax+ecx*4]
' inc ecx
' Label2:
' mov edx, dword ptr [eax]
' mov dword ptr [ebp+10h], edx
' push dword ptr [ebp+10h]
' sub eax, 04h
' dec ecx
' jne Label2
' Label1:
' call dword ptr [ebp+08h]
' mov dword ptr [ebp+0Ch], eax
' mov eax, dword ptr [ebp+14h]
' test eax, eax
' je Label3
' lea eax, dword ptr [00000000h+esi*4]
' mov dword ptr [ebp+10h], eax
' add esp, dword ptr [ebp+10h]
' Label3:
' mov eax, dword ptr [ebp+0Ch]
' pop esi
' pop ebp
' retn 0010h
_关闭对象 (hRead)
跳出循环 ()

返回值 = 返回值 + 临时
_取中断进程退出代码 (PROCESS_INFORMATION.进程句柄, EXIT)  ' 查看指定进程是否已结束
如果真 (EXIT ≠ #STILL_ACTIVE )  ' 因为会有程序退出来了,但管道中还有数据的情况,所以必须在管道中没有数据的情况下判断程序是否已结束,这时才能中止循环!
_关闭对象 (hRead)  ' 关闭管道
跳出循环 ()

处理事件 ()
判断循环尾 ()
返回 (进程ID)
回复

使用道具 举报

结帖率:84% (26/31)

签到天数: 15 天

 楼主| 发表于 4 小时前 | 显示全部楼层   美国
LEOONL 发表于 2024-10-22 13:06
[e=0].版本 2

.子程序 取DOS返回文本1, 整数型, 公开, 取出一个dos命令的返回信息。可设置即时回显。注意: ...

好像有点错误

错误所处位置: 模块:"DOS"; 程序集:"程序集"; 子程序:"取DOS返回文本2"
错误(10044): 不能将“文本型”数据转换到“整数型”数据。
回复

使用道具 举报

签到天数: 20 天

发表于 4 小时前 | 显示全部楼层   四川省宜宾市
向月亮道晚安 发表于 2024-10-22 13:16
好像有点错误

错误所处位置: 模块:"DOS"; 程序集:"程序集"; 子程序:"取DOS返回文本2"

如果真 (命令行文本 = “”)
返回 (“”)

删掉

补充内容 (2024-10-22 13:18):
或者 返回(0)
回复

使用道具 举报

结帖率:84% (26/31)

签到天数: 15 天

 楼主| 发表于 4 小时前 | 显示全部楼层   美国
LEOONL 发表于 2024-10-22 13:17
如果真 (命令行文本 = “”)
返回 (“”)

Snipaste_2024-10-22_13-23-23.png

返回的都是1,而且命令返回也只有一行了
回复

使用道具 举报

签到天数: 20 天

发表于 4 小时前 | 显示全部楼层   四川省宜宾市
向月亮道晚安 发表于 2024-10-22 13:24
返回的都是1,而且命令返回也只有一行了

放完整源码看看
回复

使用道具 举报

结帖率:84% (26/31)

签到天数: 15 天

 楼主| 发表于 3 小时前 | 显示全部楼层   美国
LEOONL 发表于 2024-10-22 13:28
放完整源码看看

我的取DOS3就是你的这个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表