欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

简陋的窗口控制台

简陋的窗口控制台

(不好意思,想要邀请码太激动了,贴发重了,请谅解)
匿名管道的应用:首先在主程序中以主程序的读、写句柄建立一个匿名管道,然后在主程序中建立一个命令行进程,把命令行进程的写句柄给主程序,最后通过主程序的一个多线程函数从匿名管道中取出数据显示在主程序中。这样可以得到一个简陋的cmd程序的窗口版本。

以主程序的读、写句柄建立一个匿名管道:
    SECURITY_ATTRIBUTES sa = {0} ;
  sa.bInheritHandle = TRUE ;
  sa.lpSecurityDescriptor = NULL ;
  sa.nLength = sizeof(SECURITY_ATTRIBUTES) ;
  if (!CreatePipe(&m_hRead, &m_hWrite, &sa, 0))
  {
    return ;
  }
建立一个命令行进程:
    PROCESS_INFORMATION pi = {0} ;
  STARTUPINFO si = {0} ;
  si.cb = sizeof(STARTUPINFO) ;
  si.dwFlags=STARTF_USESTDHANDLES|          STARTF_USESHOWWINDOW ;
  si.hStdError = si.hStdOutput = m_hWrite ;
  si.wShowWindow = SW_HIDE ;
  
  TCHAR szCmdLine[500] = {0} ;
  ZeroMemory(szCmdLine, 500) ;
  GetSystemDirectory(szCmdLine, 500) ;
  lstrcat(szCmdLine, TEXT("\\cmd.exe /c ")) ;
  lstrcat(szCmdLine, szCmdBuf) ;
  CloseHandle(m_PreProcHandle) ;
  TerminateProcess(m_PreProcHandle, 0) ;
  if(!CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
  {
    MessageBox(TEXT("创建进程失败!")) ;
  }
创建一个多线程函数从匿名管道中取出数据显示在主程序中
  m_ThreadHandle = CreateThread(NULL, 0, ShowCmdOutput, (LPVOID)pNode, 0, NULL) ;
do
  {
    bRet = PeekNamedPipe(hRead, NULL, 0, NULL, &dwTotalAvail, NULL) ;
    if (bRet && dwTotalAvail > 0)
    {
      bReturn = ReadFile(hRead, szbuf, 4096, &dwReadLen, NULL) ;
      if (bReturn && dwReadLen > 0)
      {
        lstrcat(szbufTemp, szbuf) ;
        ::SetWindowText(hwnd, szbufTemp) ;
      }
    }
    
    Sleep(50) ;
    
  }while(TRUE) ;

上传的附件 GUIConsole.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功