首页
社区
课程
招聘
[旧帖] [原创]简陋的窗口控制台 0.00雪花
发表于: 2011-3-31 22:49 2459

[旧帖] [原创]简陋的窗口控制台 0.00雪花

2011-3-31 22:49
2459

(不好意思,想要邀请码太激动了,贴发重了,请谅解)

匿名管道的应用:首先在主程序中以主程序的读、写句柄建立一个匿名管道,然后在主程序中建立一个命令行进程,把命令行进程的写句柄给主程序,最后通过主程序的一个多线程函数从匿名管道中取出数据显示在主程序中。这样可以得到一个简陋的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) ;


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 63
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
自己顶哈  希望能得到邀请码
2011-4-1 09:22
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也想拿邀请码。。。。。。。。。。
2011-4-1 11:26
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
半个月就可以拿到哦
2011-4-1 12:03
0
游客
登录 | 注册 方可回帖
返回
//