TC官方合作论坛

 找回密码
 立即注册
查看: 2196|回复: 2

[TC5.0源码] 最完美的管道命令

[复制链接]
发表于 2019-4-18 23:08:51 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 xzhbban 于 2019-4-18 23:10 编辑

@清风 大神


感谢清风大神的思路,在使用中,发现会有卡死现象,为了防止管道内部卡死,现用线程功能超时关闭,源码如下:

  1. 变量 cmd_string = 数组()

  2. 功能 pipecmd(下标, cmdstr, time_out = 10000)
  3.     变量 sa
  4.     cmd_string[下标] = ""
  5.     _SECURITY_ATTRIBUTES(sa)
  6.     sa["nLength"]["value"] = 结构体长度(sa)
  7.     sa["bInheritHandle"]["value"] = 真
  8.     //创建管道
  9.     变量 hRead, hWrite
  10.     如果(!CreatePipe(hRead, hWrite, sa, 0))
  11.         返回 ""
  12.     结束
  13.     变量 si, pi
  14.     _STARTUPINFOW(si)
  15.     _PROCESS_INFORMATION(pi)
  16.     si["cb"]["value"] = 结构体长度(si)
  17.     si["hStdError"]["value"] = hWrite
  18.     si["hStdOutput"]["value"] = hWrite
  19.     si["wShowWindow"]["value"] = 0
  20.     si["dwFlags"]["value"] = #00000101
  21.     //创建进程 与管道关联
  22.     如果(!CreateProcess(0, cmdstr, 0, 0, 1, 0, 0, 0, si, pi))
  23.         返回 ""
  24.     结束
  25.     CloseHandle(hWrite)
  26.     变量 cmd_info = 数组()
  27.     cmd_info[0] = hRead
  28.     cmd_info[1] = time_out
  29.     cmd_info[2] = 下标
  30.    
  31.     变量 thread_id, state
  32.     thread_id = 线程开启("thread_cmd", cmd_info)
  33.     遍历(变量 i = 0; i < 50; i++)
  34.         如果(字符串长度(cmd_string[下标]) > 0)
  35.             CloseHandle(hRead)
  36.             线程关闭(thread_id)
  37.             返回 cmd_string[下标]
  38.         结束
  39.         等待(200)
  40.     结束
  41.     state = 线程等待(thread_id, 50)
  42.     如果(state != 0)
  43.         CloseHandle(hRead)
  44.         线程关闭(thread_id)
  45.         返回 null
  46.     否则
  47.         CloseHandle(hRead)
  48.         线程关闭(thread_id)
  49.         返回 cmd_string[下标]
  50.     结束  
  51.     线程关闭(thread_id)
  52.     返回 null
  53. 结束


  54. 功能 thread_cmd(cmd_info) //这里接收线程开启时传入的参数
  55.     变量 hRead = cmd_info[0]
  56.     变量 time_out = cmd_info[1]
  57.     变量 下标 = cmd_info[2]
  58.     变量 nSize = 1024
  59.     变量 buffer = new(1024)
  60.     memset(buffer, 0, 1024 + 1)
  61.     变量 nReadSize = 0
  62.     变量 string
  63.     变量 time1 = 获取系统时间()
  64.     循环(ReadFile(hRead, buffer, 1024, nReadSize, 0))
  65.         //内存溢出
  66.         如果(nReadSize > 1024)
  67.             跳出
  68.         结束
  69.         //超时
  70.         变量 time2 = 获取系统时间()
  71.         如果(time2 - time1 > time_out)
  72.             跳出
  73.         结束            
  74.         string = string & 地址取值(buffer, "char *")
  75.         等待(1, 0)
  76.         memset(buffer, 0, 1024 + 1)
  77.     结束
  78.     delete(buffer)
  79.     CloseHandle(hRead)
  80.     cmd_string[下标] = string
  81.     返回 0
  82. 结束

  83. //申请内存地址
  84. 功能 new(nSize)
  85.     变量 string = 数组()
  86.     string["str"] = 数组("char" = nSize + 1, "value" = "")
  87.     返回 结构体申请内存(string)
  88. 结束
  89. //释放内存
  90. 功能 delete(address)
  91.     结构体释放内存(address)
  92. 结束
  93. //重置一段内存中值
  94. 功能 memset(address, value, nSize)
  95.     返回 动态库调用("kernel32.dll", "long", "RtlFillMemory", "long", address, "long", nSize, "long", value)
  96. 结束
  97. 功能 _SECURITY_ATTRIBUTES(&SECURITY_ATTRIBUTES)
  98.     SECURITY_ATTRIBUTES = 数组()
  99.     SECURITY_ATTRIBUTES["nLength"] =         数组("long" = 0, "value" = 0)
  100.     SECURITY_ATTRIBUTES["lpSecurityDescriptor"] =         数组("long" = 0, "value" = 0)
  101.     SECURITY_ATTRIBUTES["bInheritHandle"] =                 数组("long" = 0, "value" = 0)
  102. 结束
  103. 功能 _STARTUPINFOW(&STARTUPINFOW)
  104.     STARTUPINFOW = 数组()
  105.     STARTUPINFOW["cb"] =                         数组("long" = 0, "value" = 0)
  106.     STARTUPINFOW["lpReserved"] =         数组("long" = 0, "value" = 0)
  107.     STARTUPINFOW["lpDesktop"] =         数组("long" = 0, "value" = 0)
  108.     STARTUPINFOW["lpTitle"] =                 数组("long" = 0, "value" = 0)
  109.     STARTUPINFOW["dwX"] =                         数组("long" = 0, "value" = 0)
  110.     STARTUPINFOW["dwY"] =                         数组("long" = 0, "value" = 0)
  111.     STARTUPINFOW["dwXSize"] =                 数组("long" = 0, "value" = 0)
  112.     STARTUPINFOW["dwYSize"] =                 数组("long" = 0, "value" = 0)
  113.     STARTUPINFOW["dwXCountChars"] = 数组("long" = 0, "value" = 0)
  114.     STARTUPINFOW["dwYCountChars"] = 数组("long" = 0, "value" = 0)
  115.     STARTUPINFOW["dwFillAttribute"] = 数组("long" = 0, "value" = 0)
  116.     STARTUPINFOW["dwFlags"] =                 数组("long" = 0, "value" = 0)
  117.     STARTUPINFOW["wShowWindow"] =         数组("short" = 0, "value" = 0)
  118.     STARTUPINFOW["cbReserved2"] =         数组("short" = 0, "value" = 0)
  119.     STARTUPINFOW["lpReserved2"] =         数组("long" = 0, "value" = 0)
  120.     STARTUPINFOW["hStdInput"] =         数组("long" = 0, "value" = 0)
  121.     STARTUPINFOW["hStdOutput"] =         数组("long" = 0, "value" = 0)
  122.     STARTUPINFOW["hStdError"] =         数组("long" = 0, "value" = 0)
  123. 结束
  124. 功能 _PROCESS_INFORMATION(&PROCESS_INFORMATION)
  125.     PROCESS_INFORMATION = 数组()
  126.     PROCESS_INFORMATION["hProcess"] =         数组("long" = 0, "value" = 0)
  127.     PROCESS_INFORMATION["hThread"] =         数组("long" = 0, "value" = 0)
  128.     PROCESS_INFORMATION["dwProcessId"] = 数组("long" = 0, "value" = 0)
  129.     PROCESS_INFORMATION["dwThreadId"] = 数组("long" = 0, "value" = 0)
  130. 结束
  131. //创建管道
  132. 功能 CreatePipe(&readPipe, &writePipe, &lpPipeAttributes, nSize)
  133.     返回 动态库调用("kernel32.dll", "long", "CreatePipe", "plong", readPipe, "plong", writePipe, "pstruct", lpPipeAttributes, "long", nSize)
  134. 结束
  135. //创建进程
  136. 功能 CreateProcess(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, &lpStartupInfo, &lpProcessInformation)
  137.     返回 动态库调用("kernel32.dll", "long", "CreateProcessW", "long", lpApplicationName, "wchar *", lpCommandLine, "long", lpProcessAttributes, "long", lpThreadAttributes, "long", bInheritHandles, "long", dwCreationFlags, "long", lpEnvironment, "long", lpCurrentDirectory, "pstruct", lpStartupInfo, "pstruct", lpProcessInformation)
  138. 结束
  139. //关闭句柄
  140. 功能 CloseHandle(handle)
  141.     返回 动态库调用("kernel32.dll", "long", "CloseHandle", "long", handle)
  142. 结束
  143. //读文件句柄,可以文件,管理,io这一系列的句柄内容
  144. 功能 ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, &lpNumberOfBytesRead, lpOverlapped = 0)
  145.     返回 动态库调用("kernel32.dll", "long", "ReadFile", "long", hFile, "long", lpBuffer, "long", nNumberOfBytesToRead, "plong", lpNumberOfBytesRead, "long", lpOverlapped)
  146. 结束
复制代码



调用方法也有改变,现举例如下:


  1. 功能 test1()
  2.     变量 string1 = pipecmd(1, "ping www.baidu.com")
  3.     调试输出(string1)
  4. 结束
  5. 功能 test2()
  6.     变量 string2 = pipecmd(2, "help")
  7.     调试输出(string2)
  8. 结束
  9. 功能 test3()
  10.     变量 string3 = pipecmd(3, "ipconfig")
  11.     调试输出(string3)
  12. 结束

  13. 功能 按钮0_点击()
  14.     //这里添加你要执行的代码
  15.     线程开启("test1", "")
  16.     线程开启("test2", "")
  17.     线程开启("test3", "")
  18. 结束
复制代码
返回的值,依数组形式保存,所以,获取内容需要  cmd_string[下标] ,,


论坛的源码,不适合直接复制,,方法只供参考!!!


如有疑问,请到:862419181  群找我一起讨论!!






评分

参与人数 1威望 +10 金币 +10 收起 理由
2576605471 + 10 + 10 感谢分享!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2019-4-18 23:12:12 | 显示全部楼层
沙发自己做。。。。
回复 支持 反对

使用道具 举报

发表于 2019-4-19 12:22:35 | 显示全部楼层
返回的值,依数组形式保存,所以,获取内容需要  cmd_string[下标] ,,
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-4-17 06:12 , Processed in 0.035939 second(s), 25 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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