2017-04-14 114 views
0

当我运行下面的代码,dos窗口显示immikidi然后消失。 我想要的是窗口将保持并等待用户的下一个命令输入。 我应该怎么做与startupInfo.hStdInput如果我想保持窗口显示和我必须使用CreateProcess的在我的项目不是等的WinExecDos窗口显示然后消失immortiately

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

为什么你会像这样手动运行'ping',而不是使用['IcmpSendEcho()'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa366050.aspx) ? –

+0

我正在编写一个项目,我想通过我的win32应用程序连续输入/输出控制台,所以我希望dos窗口在代码CreateProcess(NULL,命令,NULL,NULL,TRUE,NULL,NULL,NULL和startupInfo, &processInfo)正在执行并等待下一个用户的命令 –

+0

当指定的'命令'结束运行时,DOS窗口关闭。由于'command'本身就是'ping',所以当'ping'退出时,DOS窗口会关闭。如果想在'ping'退出后保持DOS窗口打开,则需要运行'cmd.exe',而不是使用指定的'/ K'命令行开关,'ping'作为cmd.exe的初始命令'执行,例如:'cmd.exe/K ping 192.168.0.1'。使用'%COMSPEC%'环境变量来获取'cmd.exe'的完整路径。 –

回答

0

如果问题是工艺窗口立即关闭,可能是你应该添加pause ......要能看到你的ping命令的结果..

现在,我绝不c++专家...但我建议,尝试沿着下面的代码行的东西...

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

为什么要用'&k'开关使用'&& pause && exit'? OP说“*等待用户的下一个命令输入*”,但是这个组合不允许输入更多的用户命令。自己使用'/ k'会。如果你只是要退出,你可以放弃'&& exit'并使用'/ c'而不是'/ k'。 –

+0

@RemyLebeau你可能是对的......我有点错过了“下一个命令”部分...... – Plirkee