我需要启动一个启动命令行的进程(它不应该弹出,所以像后台进程)。打开cmd并读取和写入它
然后我需要写东西给它并定期读取cmd的最后一行。
由于我的C++技能不是很好,我不知道如何实现这一点。
在伪方式我想过这样的事情:
startProcess();
writeToCmd();
readFromCmd() { // Call that every given interval (e.g. 1000 ms)
if(returnValue >= 100) {
stopProcess();
}
}
我敢肯定它会不会是那么容易。如果有人能帮助我,这将是非常好的。 这个程序是用于windows的。建议操作后
编辑: 这是我到目前为止已经做了(我做了一点点不同)
int errorCode;
// Variables for CreateProcess()
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
PHANDLE hInRead, hInWrite;
LPDWORD bytesWritten, bytesRead;
// The CommandLine input
TCHAR tcsCommandLine[] = _T("cmd /c format H: /fs:FAT32 /V:device");
//TCHAR tcsCommandLine[] = _T("cmd /c start D:\\foo.txt");
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.wShowWindow = SW_SHOW; // SW_HIDE FOR PRODUCTION
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.hStdInput = hInRead;
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
ZeroMemory(&pi, sizeof(pi));
errorCode = CreatePipe(hInRead, hInWrite, &sa, 0);
info = GetDriveInfo(m_wsNANDMountPoint);
if(info.m_uSizeInMB > 2048) {
log("Wrong Mounting Point. Device has more than 2GB space.");
return false;
}
else {
// Start Formatting
if(!CreateProcess(NULL, tcsCommandLine,
NULL, NULL,
TRUE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL,
&si,
&pi)) {
log("CreateProcess failed. Could not format Drive");
return false;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
WriteFile(hInWrite, "#13#10'J'#13#10", 5, bytesWritten, NULL);
CloseHandle(hInWrite);
// Wait until child process exits
WaitForSingleObject(pi.hProcess, 1100);
}
return true;
调试的一点点后,我认识到,没有按代码”在ZeroMemory()
牛逼突破,但
errorCode = CreatePipe(hInRead, hInWrite, &sa, 0);
与Access violation writing location
错误。我不知道我在做什么错。 如果你们能够帮助我,这将会非常棒。
这并没有多大意义。你能否提供一些有关实际问题的更多细节,而不是你如何设想解决方案的外观。无论问题出在哪,每秒轮询肯定不是解决方案。 – 2011-12-20 13:16:55