2017-04-14 7 views
0

아래 코드를 실행하면 dos 창이 즉시 나타나서 사라집니다. 내가 원하는 것은 윈도우가 머무르고 다음 명령 입력을 기다리는 것이다. 무엇을 나는 창을 보여주는를 유지하려는 경우 내가 startupInfo.hStdInput와 함께 할 내가 문제가 공정 윈도우를 즉시 종료한다는 경우가 아닌 winexec 등도스 창이 나타나 즉시 사라집니다.

int WINAPI WinMain(
        HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR lpComLine, 
        int nCmdShow) 
{ 
    SECURITY_ATTRIBUTES secAttr; 
    HANDLE hRead,hWrite; 

secAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
secAttr.lpSecurityDescriptor = NULL; 
secAttr.bInheritHandle = TRUE; 
if (!CreatePipe(&hRead,&hWrite,&secAttr,0)) 
{ 
    return FALSE; 
} 

char command[1024]; 
strcpy(command,"ping 192.168.0.1"); 

STARTUPINFO startupInfo; 
PROCESS_INFORMATION processInfo; 
startupInfo.cb = sizeof(STARTUPINFO); 
GetStartupInfo(&startupInfo); 
startupInfo.hStdError = hWrite;  
startupInfo.hStdOutput = hWrite; 
startupInfo.hStdInput = hRead;   
startupInfo.lpTitle = "CMD"; 

if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&startupInfo,&processInfo)) 
{ 
     MessageBox(NULL, "Failed", NULL, MB_OK); 
     CloseHandle(hWrite); 
     CloseHandle(hRead); 
     return FALSE; 
} 

CloseHandle(hWrite); 
CloseHandle(hRead); 

return 0; 
} 
+0

['IcmpSendEcho()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366050.aspx) 대신 수동으로'ping'을 수동으로 실행하는 이유는 무엇입니까? ? –

+0

필자는 Win32 응용 프로그램을 통해 콘솔에서 연속 입출력을 원하는 프로젝트를 작성 중이므로 코드 창 CreateProcess (NULL, 명령, NULL, NULL, TRUE, NULL, NULL, NULL, & startupInfo, & processInfo)가 실행 중이고 다음 사용자의 명령을 기다림 –

+0

지정된 '명령'실행이 완료되면 DOS 창이 닫힙니다. '명령 '자체가'핑 (ping)'이기 때문에'핑 (ping) '이 끝나면 DOS 창이 닫힙니다. 'ping'이 종료 된 후에 도스 윈도우를 열어두기를 원한다면,'/ K' 명령 행 스위치를 지정하고 대신'cmd.exe'를 실행하고'cmd.exe '의 초기 명령으로'ping'을 실행해야합니다 '예 :'cmd.exe/K ping 192.168.0.1'. '% COMSPEC %'환경 변수를 사용하여'cmd.exe'에 대한 전체 경로를 얻으십시오. –

답변

0

내 프로젝트에서 CreateProcess를을 사용해야한다, 할 수있다 당신은 내가 결코 c++ 전문가에서 오전, 지금 ... 당신의 ping 명령의 결과를 볼 수 있도록 ... pause

을 추가해야합니다 ...하지만, 제안 다음 코드 라인을 따라 뭔가를 시도하는 ...

CreateProcess( 
         "c:\\windows\\system32\\cmd.exe", 
         "/k ping 192.168.0.1 && pause && exit", 
         NULL, 
         NULL, 
         FALSE, 
         0, 
         NULL, 
         NULL, 
         &startupInfo,&processInfo); 
+0

왜'/& pause && exit'를'/ k' 스위치와 함께 사용 하시겠습니까? OP는 "사용자의 다음 명령 입력 대기 *"라고 말했지만,이 콤보는 더 많은 사용자 명령을 입력 할 수 없습니다. '/ k'를 단독으로 사용하면됩니다. 끝내려면'/ & exit '를 버리고'/ k' 대신에'/ c'를 사용할 수 있습니다. –

+0

@RemyLebeau 당신은 아마 맞을 것입니다 ... 나는 "다음 명령"부분을 놓친 것 같습니다 ... – Plirkee