vc 利用无名管道 控制台程序实现cmd功能
来源:互联网 发布:mac系统jdk下载 编辑:程序博客网 时间:2024/06/07 15:02
#include "stdafx.h"#include <windows.h>//进程间通信//管道typedef struct tagParam{ HANDLE hWritePipe; HANDLE hReadPipe;}PARAM, *LPPARAM;int ThreadFunc(LPVOID param){ char szBuf[4096]; DWORD dwReadBytes = 0; char strShellPath[MAX_PATH] = { 0 }; DWORD dwBytesRead; DWORD dwTotalBytesAvail; BOOL bRet = FALSE; LPVOID lpBuffer = NULL; HANDLE hReadPipe = ((LPPARAM)param)->hReadPipe; HANDLE hWritePipe = ((LPPARAM)param)->hWritePipe; while (TRUE) { bRet = PeekNamedPipe(hReadPipe, szBuf, sizeof(4096), &dwBytesRead, &dwTotalBytesAvail, NULL); if (bRet) { if (dwBytesRead <= 0) { continue; } memset(szBuf, 0, sizeof(szBuf)); lpBuffer = (LPBYTE)LocalAlloc(LPTR, dwTotalBytesAvail + 1); if (lpBuffer == NULL) { break; } memset(lpBuffer, 0, dwTotalBytesAvail + 1); ReadFile(hReadPipe, lpBuffer, dwTotalBytesAvail, &dwBytesRead, NULL); if (!bRet) { if (lpBuffer != NULL) { LocalFree(lpBuffer); lpBuffer = NULL; } break; } printf("%s", lpBuffer); } } return 0;}int main(int argc, char* argv[]){HANDLE hCmdReadPipe = NULL; HANDLE hReadPipe = NULL;HANDLE hCmdWritePipe = NULL; HANDLE hWritePipe = NULL;BOOL fRet = FALSE; char szBuf[4096]; BOOL bRet = FALSE; LPVOID lpBuffer = NULL; PARAM param; DWORD dwWriteBytes; SECURITY_ATTRIBUTES sa = { 0 }; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; fRet = CreatePipe(&hCmdReadPipe, &hWritePipe, &sa, 0);if(!fRet){return GetLastError();} fRet = CreatePipe(&hReadPipe, &hCmdWritePipe, &sa, 0); if (!fRet) { return GetLastError(); } STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(STARTUPINFO)); memset(&pi, 0, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.hStdInput = hCmdReadPipe; si.hStdOutput = hCmdWritePipe; si.hStdError = hCmdWritePipe; si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; fRet = CreateProcess(NULL, "cmd", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); if (!fRet) { return GetLastError(); } param.hReadPipe = hReadPipe; param.hWritePipe = hWritePipe; CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadFunc, ¶m, 0,NULL); while (TRUE) { memset(szBuf, 0, sizeof(szBuf)); gets(szBuf); strcat(szBuf, "\r\n"); WriteFile(hWritePipe, szBuf, strlen(szBuf), &dwWriteBytes, NULL); }return 0;}
就是创建两条无名管道,然后本控制台程序与新建的cmd程序进行通讯即可。
这个程序的问题是没有做结束cmd进程的等待事件,然后就是显示的话命令会显示两次,可以考虑设置程序光标的位置来去掉,这里我就不写了,没什么技术含量
0 0
- vc 利用无名管道 控制台程序实现cmd功能
- 利用无名管道实现简单并行计算
- 利用管道实现控制台程序输入输出的重定向
- 利用管道实现控制台程序输入输出的重定向
- VC调用CMD命令通过控制台管道获取输出结果
- 利用匿名管道实现远程CMD
- 利用匿名管道实现远程CMD
- 利用匿名管道实现远程CMD(转)
- 利用匿名管道实现CMD回显
- 利用匿名管道实现远程CMD(转)
- 利用匿名管道实现远程调用CMD
- 利用有名管道&无名管道 实现 简单的多人聊天
- Delphi中利用管道重定向实现对控制台(Console)程序的操作
- 匿名管道实现获取控制台程序输出
- 在控制台(cmd)运行java程序,实现增,删,改,查功能
- VC 匿名管道获取控制台程序的输出
- 利用管道获取控制台程序的标准输出
- 利用管道获取控制台程序的标准输出
- 线程的封装
- VS2010环境下,c++嵌入Python环境配置问题
- Hadoop项目实战-用户行为分析之分析与设计
- spring-data-redis + Jedis配置文件
- 轻松搞定面试中的二叉树题目
- vc 利用无名管道 控制台程序实现cmd功能
- FastDFS、Nginx安装、配置、测试(java client)
- 类扫描工具类
- ElasticSearch关联查找
- shell脚本实现多台服务器自动巡检--可参考学习
- 各种 Java 的序列化库的性能比较测试结果
- 基于Spark MLlib平台的协同过滤算法---电影推荐系统
- 实时推荐系统的3种方式
- 使用Eclipse插件提高Java编码质量