popenのプロンプト画面非表示

[戻る]
ゲンガオ 2010/11/22(月) 23:17:51
タイトルどおりpopen関数でのプロンプト画面を非表示にするやりかたを探しています。

しかしコマンドがたたけてコマンドプロンプトが非表示になるならなんでもいいです。
でも、batファイルを作成するのはなしです。

system   →非表示にするやり方がわからない
shellexecute→バッチファイルはダメ(winexecも同様)
popen

2010/11/23(火) 01:44:29
CreateProcessでよいのでは?
他にも
exec系
fork系
ありそうですけど、試す気にはなりません
>でも、batファイルを作成するのはなしです。
#この書き方は微妙に回答減ると思いますよ。

solid 2010/11/23(火) 04:35:35
popenは使ったことがないのでパスして
CreatePipeとCreateProcessで試してみました

CString Execute(CString strIn)
{
  SECURITY_ATTRIBUTES saAttr ;
  HANDLE hSaveStdOut ;
  HANDLE hSaveStdIn ;
  HANDLE hSaveStdError ;
  HANDLE hChildStdoutRead;
  HANDLE hChildStdoutWrite;
  CString strOut ;

  strOut = _T("") ;

  saAttr.nLength = sizeof(SECURITY_ATTRIBUTES) ;
  saAttr.bInheritHandle = true ;
  saAttr.lpSecurityDescriptor = NULL ;

  hSaveStdOut = GetStdHandle(STD_OUTPUT_HANDLE) ;
  hSaveStdIn = GetStdHandle(STD_INPUT_HANDLE) ;
  hSaveStdError = GetStdHandle(STD_ERROR_HANDLE) ;

  if(!CreatePipe(&hChildStdoutRead, &hChildStdoutWrite, 
                 &saAttr, 4096)) {
    return strOut;
  }

  if(!SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWrite)) {
    return strOut;
  }

  PROCESS_INFORMATION Process ;
  STARTUPINFO      StartInfo ;
  memset(&StartInfo, 0, sizeof(STARTUPINFO)) ;
  StartInfo.cb = sizeof(STARTUPINFO);
  StartInfo.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
  StartInfo.wShowWindow = SW_HIDE ;
  StartInfo.hStdInput = hSaveStdIn ;
  StartInfo.hStdOutput = hChildStdoutWrite ;
  StartInfo.hStdError = hSaveStdError ;

  if(!CreateProcess(NULL, strIn.GetBuffer(), NULL, &saAttr, 
                    true, CREATE_NEW_CONSOLE, NULL, NULL, 
                    &StartInfo, &Process)) {
    return strOut;
  }

  if(!SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdOut)) {
    CloseHandle(hChildStdoutWrite) ;
    return strOut;
  }
  CloseHandle(hChildStdoutWrite) ;

  DWORD dwOutRead;
  DWORD dwRtn ;
  bool bEnd = false ;
  CHAR szBuffer[1024] ;
  TCHAR* pDst ;
  int sizeInput ;

  sizeInput = 0 ;
  while (1)
  {
    if(!ReadFile(hChildStdoutRead, szBuffer, 1000,
         &dwOutRead, NULL)) {
      dwOutRead = 0 ;
    }
    if(dwOutRead==0 && bEnd == true) {
      break ;
    }
    if(dwOutRead>0) {
      szBuffer[dwOutRead] = 0 ;
      pDst = ConvertToUnicode(szBuffer)  ;
      strOut += pDst ;
      delete [] pDst ;
    }
    dwRtn = WaitForSingleObject(Process.hProcess, 0) ;
    if(dwRtn == WAIT_ABANDONED || dwRtn ==WAIT_OBJECT_0) {
      bEnd = true ;
    }
    Sleep(10) ;
  }

  return strOut ;
}

古いスレッドには追加発言できません。