vc 利用无名管道 控制台程序实现cmd功能

#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, &param, 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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值