|
马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 xzhbban 于 2019-4-18 23:10 编辑
@清风 大神
感谢清风大神的思路,在使用中,发现会有卡死现象,为了防止管道内部卡死,现用线程功能超时关闭,源码如下:
- 变量 cmd_string = 数组()
- 功能 pipecmd(下标, cmdstr, time_out = 10000)
- 变量 sa
- cmd_string[下标] = ""
- _SECURITY_ATTRIBUTES(sa)
- sa["nLength"]["value"] = 结构体长度(sa)
- sa["bInheritHandle"]["value"] = 真
- //创建管道
- 变量 hRead, hWrite
- 如果(!CreatePipe(hRead, hWrite, sa, 0))
- 返回 ""
- 结束
- 变量 si, pi
- _STARTUPINFOW(si)
- _PROCESS_INFORMATION(pi)
- si["cb"]["value"] = 结构体长度(si)
- si["hStdError"]["value"] = hWrite
- si["hStdOutput"]["value"] = hWrite
- si["wShowWindow"]["value"] = 0
- si["dwFlags"]["value"] = #00000101
- //创建进程 与管道关联
- 如果(!CreateProcess(0, cmdstr, 0, 0, 1, 0, 0, 0, si, pi))
- 返回 ""
- 结束
- CloseHandle(hWrite)
- 变量 cmd_info = 数组()
- cmd_info[0] = hRead
- cmd_info[1] = time_out
- cmd_info[2] = 下标
-
- 变量 thread_id, state
- thread_id = 线程开启("thread_cmd", cmd_info)
- 遍历(变量 i = 0; i < 50; i++)
- 如果(字符串长度(cmd_string[下标]) > 0)
- CloseHandle(hRead)
- 线程关闭(thread_id)
- 返回 cmd_string[下标]
- 结束
- 等待(200)
- 结束
- state = 线程等待(thread_id, 50)
- 如果(state != 0)
- CloseHandle(hRead)
- 线程关闭(thread_id)
- 返回 null
- 否则
- CloseHandle(hRead)
- 线程关闭(thread_id)
- 返回 cmd_string[下标]
- 结束
- 线程关闭(thread_id)
- 返回 null
- 结束
- 功能 thread_cmd(cmd_info) //这里接收线程开启时传入的参数
- 变量 hRead = cmd_info[0]
- 变量 time_out = cmd_info[1]
- 变量 下标 = cmd_info[2]
- 变量 nSize = 1024
- 变量 buffer = new(1024)
- memset(buffer, 0, 1024 + 1)
- 变量 nReadSize = 0
- 变量 string
- 变量 time1 = 获取系统时间()
- 循环(ReadFile(hRead, buffer, 1024, nReadSize, 0))
- //内存溢出
- 如果(nReadSize > 1024)
- 跳出
- 结束
- //超时
- 变量 time2 = 获取系统时间()
- 如果(time2 - time1 > time_out)
- 跳出
- 结束
- string = string & 地址取值(buffer, "char *")
- 等待(1, 0)
- memset(buffer, 0, 1024 + 1)
- 结束
- delete(buffer)
- CloseHandle(hRead)
- cmd_string[下标] = string
- 返回 0
- 结束
- //申请内存地址
- 功能 new(nSize)
- 变量 string = 数组()
- string["str"] = 数组("char" = nSize + 1, "value" = "")
- 返回 结构体申请内存(string)
- 结束
- //释放内存
- 功能 delete(address)
- 结构体释放内存(address)
- 结束
- //重置一段内存中值
- 功能 memset(address, value, nSize)
- 返回 动态库调用("kernel32.dll", "long", "RtlFillMemory", "long", address, "long", nSize, "long", value)
- 结束
- 功能 _SECURITY_ATTRIBUTES(&SECURITY_ATTRIBUTES)
- SECURITY_ATTRIBUTES = 数组()
- SECURITY_ATTRIBUTES["nLength"] = 数组("long" = 0, "value" = 0)
- SECURITY_ATTRIBUTES["lpSecurityDescriptor"] = 数组("long" = 0, "value" = 0)
- SECURITY_ATTRIBUTES["bInheritHandle"] = 数组("long" = 0, "value" = 0)
- 结束
- 功能 _STARTUPINFOW(&STARTUPINFOW)
- STARTUPINFOW = 数组()
- STARTUPINFOW["cb"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["lpReserved"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["lpDesktop"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["lpTitle"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["dwX"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["dwY"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["dwXSize"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["dwYSize"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["dwXCountChars"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["dwYCountChars"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["dwFillAttribute"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["dwFlags"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["wShowWindow"] = 数组("short" = 0, "value" = 0)
- STARTUPINFOW["cbReserved2"] = 数组("short" = 0, "value" = 0)
- STARTUPINFOW["lpReserved2"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["hStdInput"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["hStdOutput"] = 数组("long" = 0, "value" = 0)
- STARTUPINFOW["hStdError"] = 数组("long" = 0, "value" = 0)
- 结束
- 功能 _PROCESS_INFORMATION(&PROCESS_INFORMATION)
- PROCESS_INFORMATION = 数组()
- PROCESS_INFORMATION["hProcess"] = 数组("long" = 0, "value" = 0)
- PROCESS_INFORMATION["hThread"] = 数组("long" = 0, "value" = 0)
- PROCESS_INFORMATION["dwProcessId"] = 数组("long" = 0, "value" = 0)
- PROCESS_INFORMATION["dwThreadId"] = 数组("long" = 0, "value" = 0)
- 结束
- //创建管道
- 功能 CreatePipe(&readPipe, &writePipe, &lpPipeAttributes, nSize)
- 返回 动态库调用("kernel32.dll", "long", "CreatePipe", "plong", readPipe, "plong", writePipe, "pstruct", lpPipeAttributes, "long", nSize)
- 结束
- //创建进程
- 功能 CreateProcess(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, &lpStartupInfo, &lpProcessInformation)
- 返回 动态库调用("kernel32.dll", "long", "CreateProcessW", "long", lpApplicationName, "wchar *", lpCommandLine, "long", lpProcessAttributes, "long", lpThreadAttributes, "long", bInheritHandles, "long", dwCreationFlags, "long", lpEnvironment, "long", lpCurrentDirectory, "pstruct", lpStartupInfo, "pstruct", lpProcessInformation)
- 结束
- //关闭句柄
- 功能 CloseHandle(handle)
- 返回 动态库调用("kernel32.dll", "long", "CloseHandle", "long", handle)
- 结束
- //读文件句柄,可以文件,管理,io这一系列的句柄内容
- 功能 ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, &lpNumberOfBytesRead, lpOverlapped = 0)
- 返回 动态库调用("kernel32.dll", "long", "ReadFile", "long", hFile, "long", lpBuffer, "long", nNumberOfBytesToRead, "plong", lpNumberOfBytesRead, "long", lpOverlapped)
- 结束
复制代码
调用方法也有改变,现举例如下:
- 功能 test1()
- 变量 string1 = pipecmd(1, "ping www.baidu.com")
- 调试输出(string1)
- 结束
- 功能 test2()
- 变量 string2 = pipecmd(2, "help")
- 调试输出(string2)
- 结束
- 功能 test3()
- 变量 string3 = pipecmd(3, "ipconfig")
- 调试输出(string3)
- 结束
- 功能 按钮0_点击()
- //这里添加你要执行的代码
- 线程开启("test1", "")
- 线程开启("test2", "")
- 线程开启("test3", "")
- 结束
复制代码 返回的值,依数组形式保存,所以,获取内容需要 cmd_string[下标] ,,
论坛的源码,不适合直接复制,,方法只供参考!!!
如有疑问,请到:862419181 群找我一起讨论!!
|
评分
-
查看全部评分
|