000
19.07.2005, 08:27 Uhr
ziba
|
Hallo, ich habe ein altes DOS- Programm, das unter WinXP in der Konsole (cmd) läuft. Jetzt möchte ich dieses Programm von meinem VC++ Programm aus starten und das DOS- Programm bedienen, also Texte schreiben oder F- Tasten simulieren.
Ich lege eine Pipe an (CreatePipe), starte den Prozess mit CreateProcess und schreibe mit WriteFile in die Pipe.
Was muss ich tun, damit das DOS- Programm, das nichts von der Pipe weiss, diese Eingaben auch annimmt/ anzeigt?
Mit dem folgenden Programm kann ich den Prozess starten und in die Pipe schreiben, allerdings kommt nichts an.
C++: |
void CShellViewDlg::OnCreate() { SECURITY_ATTRIBUTES sa; ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; //TODO
//sichern des Handles hSaveStdin = GetStdHandle(STD_INPUT_HANDLE); HANDLE hSaveStdin = GetStdHandle(STD_INPUT_HANDLE); //Pipe anlegen if(!CreatePipe(&hChildStdinRd, &hChildStdinWr, &sa,0)){ MessageBox("Fehler beim Pipe- Erzeugen"); }
if(!SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd)){ MessageBox("Fehler bei Verbindung zu Stdin"); }
//Duplizieren des Schreib Handels, damit es nicht vererbt wird if(!DuplicateHandle(GetCurrentProcess(), hChildStdinWr, GetCurrentProcess(), &hChildStdinWrDup, 0,FALSE, DUPLICATE_SAME_ACCESS)){ MessageBox("Fehler beim Duplizieren"); } CloseHandle(hChildStdinWr);
/******************************************************************** ********** Prozess starten ********************************** ********************************************************************/ STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO));
// stdin, stdout und stderr des Kindes in STARTUPINFO eintragen si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = hChildStdinRd; si.hStdOutput = hChildStdoutWr; si.hStdError = hChildStdoutWr;
PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); GetStartupInfo(&si);
BOOL ret = CreateProcess(NULL,"C:\\WINNT\\System32\\cmd.exe",// Name der Appl &sa, // Default process security attributes NULL, // Default thread security attributes TRUE, // inherit handles from the parent 0, // Normal priority NULL, // Use the same environment as the parent NULL, // Launch in the current directory &si, // Startup Information &pi); // Process information stored upon return if(ret){ int dwProcessId = pi.dwProcessId; char final_string[200]; sprintf(final_string, "ProzessId: %i", dwProcessId); MessageBox(final_string); //Beendet den Prozess // HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE,dwProcessId ); // TerminateProcess (hProcess,0); // CloseHandle(hProcess); } else { MessageBox("Fehler beim Erzeugen des Prozesses"); } }
//in die Pipe schreiben void CShellViewDlg::Write(HANDLE childStdinWrDup) { LPCTSTR line = "Test von Stdin"; DWORD dwWritten; if(!WriteFile(childStdinWrDup, line, _tcslen(line)*sizeof(TCHAR),&dwWritten,NULL)){ MessageBox("Fehler beim Schreiben"); } else{ char final_string[200]; sprintf(final_string, "Länge des geschriebenen Textes: %i", dwWritten); MessageBox(final_string); } }
// void CShellViewDlg::OnWrite() { Write(hChildStdinWrDup); }
|
gruss ziba Dieser Post wurde am 19.07.2005 um 09:09 Uhr von ziba editiert. |