タイトルどおりpopen関数でのプロンプト画面を非表示にするやりかたを探しています。
しかしコマンドがたたけてコマンドプロンプトが非表示になるならなんでもいいです。
でも、batファイルを作成するのはなしです。
system →非表示にするやり方がわからない
shellexecute→バッチファイルはダメ(winexecも同様)
popen
CreateProcessでよいのでは?
他にも
exec系
fork系
ありそうですけど、試す気にはなりません
>でも、batファイルを作成するのはなしです。
#この書き方は微妙に回答減ると思いますよ。
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 ;
}