öffnen Sie cmd ein und Lesen und schreiben hinein
Brauche ich, um einen Prozess zu starten, das startet die Kommandozeile (sollte es nicht pop-up, also so etwas wie ein hintergrund-Prozess).
Dann muss ich schreiben, Zeug, um es und in regelmäßigen Abständen zu Lesen, die Letzte Zeile den Befehl cmd ein.
Da meine C++ Fähigkeiten sind nicht so toll ich weiß nicht, wie Sie diese erreichen.
In einem pseudocode Weg, ich dachte an so etwas wie dieses:
startProcess();
writeToCmd();
readFromCmd() { //Call that every given interval (e.g. 1000 ms)
if(returnValue >= 100) {
stopProcess();
}
}
Ich bin mir ziemlich sicher, es werde nicht einfach werden. Es wäre wirklich toll, wenn mir jemand helfen kann hier.
Das programm ist für windows.
Bearbeiten, wenn die Vorschläge:
Dies ist, was ich bisher gemacht habe (ich habe es ein bisschen anders.)
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;
Nach ein wenig Debuggen, erkannte ich, dass der code nicht zu brechen bei ZeroMemory()
, aber auf
errorCode = CreatePipe(hInRead, hInWrite, &sa, 0);
mit einem Access violation writing location
Fehler. Ich habe keine Ahnung, was ich falsch mache.
Es wäre wirklich toll, wenn Euch könnte mir helfen.
- Dies macht nicht viel Sinn. Könnten Sie einige weitere details zu dem eigentlichen problem, anstatt, wie Sie sich die Lösung aussieht. Egal, was das problem ist, polling jede Sekunde ist sicherlich nicht die Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie tun müssen, ist in diesem Fall erstellen Sie eine Konsole mit einem versteckten Fenster. Wenn Sie CreateProcess zum launch der Konsole, Sie sollte in der Lage sein, um die Sichtbarkeit der Fenster durch die STARTUPINFO Struktur.
Der nächste Schritt ist die Umleitung der Eingabe und Ausgabe von der Konsole. Sie können dies tun, durch die Anbringung des 3-Konsole verarbeitet (input, output, error) zu Rohren und zu Lesen, die von Ihrem übergeordneten Prozess. In diesem MSDN-Artikel beschreibt, wie genau das zu tun.
ZeroMemory(&si, sizeof(STARTUPINFO));
si
ist schreibgeschützt (read-only). Veröffentlichen Sie Ihre aktuellen Bemühungen in der ursprünglichen Frage und wir können Ihnen helfen mehr.Die Befehlszeile besteht aus zwei teilen, die Sie interessieren könnten.
Da brauchen Sie nicht den Bildschirm sichtbar sein, dann müssen Sie diese zwei Dinge in deinem Programm. Also von hier aus auf, vergessen Sie cmd ein.
Ausführen von Programmen in Ihrem Programm haben Sie viele Möglichkeiten. Wenn Sie möchten, dass die Ausführung der Linien zu suchen, genau so, wie Sie es schreiben in cmd, die Sie verwenden können
system
(obwohl Windows-Versionen von fork/exec mehr Sinn machen). Zum Beispiel:Führt
my_prog.exe
mit--option
undfile.txt
als Argumente.Nun die zweite, Sie sagte, Sie wollte zu Lesen, die Letzte Zeile vom cmd. Die Idee dies zu realisieren ist, um die Ausgabe von alles in einer Datei, statt im cmd.
Wenn Sie interessiert sind, nur die Letzte Zeile an jeder Instanz, leiten Sie die Ausgabe Ihrer Programme zu einer Datei wie dieser:
oder wenn Sie möchten, um die ganze Geschichte, Sie können Anhängen statt überschreiben:
Wenn Sie auch umleiten möchten
stderr
können Sie schreiben:Die notation kann linuxy, versuchen, es in Ihrem windows sehen, ob es funktioniert (manuell in einer normalen cmd). Man könnte auch die google-Suche nach "shell-Umleitung", und Sie bekommen eine Menge von Ergebnissen.
Sowieso, wenn Sie wollen, dass die Letzte Zeile der cmd auch den Befehl selbst, können Sie überschreiben/Anhängen der Befehl-Linie an, die insbesondere sich selbst in das Programm.
>
und>>
.Lassen Sie mich dies hinzufügen, diese hervorragenden Antworten:
Dieser link zeigt die Konsole Lesen und schreiben : http://www.adrianxw.dk/SoftwareSite/Consoles/Consoles2.html
Dinge tun in regelmäßigen Abständen, verwenden Sie
SetTimer()
.http://msdn.microsoft.com/en-us/library/windows/desktop/ms644906(v=vs. 85).aspx
Den
SetTimer
Funktion führt eine Funktion alle x Millisekunden.Beispiel:
Die folgende console-Programm funktioniert wie folgt: Sie setzt einen timer mit SetTimer
dann Schleifen in einer message-loop. Die message-loop empfängt und verarbeitet
WM_TIMER
Nachrichtenund die timer-callback auch aufgerufen wird für jedes Zeitintervall.
Legen Sie einfach die Sachen, die Sie erledigen wollen, in die
TimerProc()
Funktion.