因此,如果您运行下面的代码,它将永远停止在int retVal = WaitForSingleObject(processInfo.hProcess, INFINITE);
。但是当我运行“ipconfig”或“ping 192.168.0.1”而不是“systeminfo”时,代码完美地工作。我想知道如何解决问题以及导致此问题的原因是什么?执行“systeminfo”命令后,waitforsingleobject停止
#include <windows.h>
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, "systeminfo");
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo;
startupInfo.cb = sizeof(STARTUPINFO);
GetStartupInfo(&startupInfo);
startupInfo.hStdError = hWrite;
startupInfo.hStdOutput = hWrite;
startupInfo.hStdInput = hRead;
startupInfo.lpTitle = "CMD";
startupInfo.wShowWindow = SW_HIDE;
startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&startupInfo,&processInfo))
{
MessageBox(NULL, "Error", NULL, MB_OK);
CloseHandle(hWrite);
CloseHandle(hRead);
return FALSE;
}
char buffer[1024] = {0};
DWORD bytesRead;
int retVal = WaitForSingleObject(processInfo.hProcess, INFINITE);
if (retVal == WAIT_FAILED)
MessageBox(NULL, "WAIT_FAILED", NULL, MB_OK);
else if (retVal == WAIT_TIMEOUT)
MessageBox(NULL, "WAIT_TIMEOUT", NULL, MB_OK);
ReadFile(hRead,buffer,1024,&bytesRead,NULL);
MessageBox(NULL, buffer, NULL, MB_OK);
CloseHandle(hWrite);
CloseHandle(hRead);
return 0;
}
好的,你说的话对我有意义,我有点理解我的程序中有什么问题。但是当你运行它时,同样的代码是如何工作的,而它却不能在我的编译器上工作?而我仍然无法弄清楚这个谣言。 systeminfo程序完全退出后,我想要ReadFile。 –
你是完全正确的,管道写在我的电脑上4KB。不知何故,我认为它是64kb在你的这就是为什么它在你的计算机上完美运行。我使用文件重定向输出而不是管道。我现在可以成功地获得输出,但我仍然输入来控制任何解决方案? –