Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Createprocess cmd.exe dann schreiben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
13.02.2006, 20:54 Uhr
Kabel



Hallo,

sorry wenn ich wieder auf euch zurückgreifen muss, aber ich hab eine cmd.exe mit Createprocess gemacht, wie lautet bitte der Befehl(und die Syntax wenn möglich) um etwas in diese cmd zu schreiben?

Ich hab auch AllocCosnsole benutz, brauch nur noch den Befehl um etwas hinter die Eingabeaufforderung zu schreiben, oder besser gesagt vom Programm schreiben zu lassen...

Wäre sehr dankbar für Hilfe,

hab schon mit WriteConsole versucht scheint aber nicht zu klappen...

mfg
Kabel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.02.2006, 21:59 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja reinschreiben kannste nur über pipes.

also:

1. AllocConsole
2. Handles für diese Konsole entsprechend lesen
3. CreateProcess mit Inherit-Handles-Flag cmd.exe ausführen
4. über WriteFile und ReadFile (auf die entsprechenden Handles) etwas in die "Konsole" schreiben bzw lesen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.02.2006, 22:18 Uhr
Kabel



Hallo,

danke, soweit hab ich das auch so gemacht...

ich hab AllocConsole() benutzt, dann die Handels konfiguriert hab nun einen In und einen Out...
dann hab ich mit CreateProcess die CMD gestartet (geht alles) Aber mit writefile komm ich nicht klar.

Ich hab das in den Handle In geschrieben, richtig? Aber irgendwie schreibt er mir nichts rein, die syntax müsste aber stimmen...

Und normalerweise müsste was ich WriteFile sage zu schreiben (zB "dir") hinter CDocuments and Settings\ kommen oder seh ich das falsch?

Ich danke für die Hilfe bisher, ich wechsle den PC schnell und editiere die Zeile aus dem Code.

mfg
Kabel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.02.2006, 22:22 Uhr
Kabel



Naja editieren geht nicht

Also mein Code:


C++:
DWORD k;
        WriteFile (hOut,dir,1024,&k,NULL);


ich habe mich geirrt, ich habe es in den Handle out geschrieben und nicht in den in, ist das richtig so?

mfg, und danke,
Kabel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.02.2006, 10:04 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja so:

befehle schreiben -> cmd.exe[in]
ausgabe lesen <- cmd.exe[out]

in ist das worauf cmd.exe dann "hört", out das worein es schreibt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.02.2006, 14:44 Uhr
Kabel



achso na dann dürfte das ja jetzt gelöst sein...

ich seh einfach mal vor lauter Bäumen den Wald nicht mehr... *g* (ist mir klar dass der Spruch nicht genau so ist...)

ich danke dir wiedermal sehr, mfg
Kabel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.02.2006, 15:25 Uhr
Kabel



Also
ich frag mich mal b ich dumm bin ...

Ich denke jedenfalls dass ich alles befolgt habe was ihr mir gesagt habt, und es get trotzdem nicht, es passiert einfach nichts. Ziel ist es ja dass was in die CMD geschrieben wird vom Programm selber, ich denke ich poste mal meinen Code Teilweise und ich würde mich sehr freuen wenn ihr mir sagen könntet was da nicht in Ordnung ist, ich such schon Tagelang, so langsam weiss ich nicht ehr was ich probiert habe und was nicht :/

Also hier kommt ein Teil des Programmes:

C++:
HANDLE hIn;
      hIn = GetStdHandle(STD_INPUT_HANDLE);  //Input Handle wird aufgesetzt
      if (hIn != INVALID_HANDLE_VALUE) //Ausführen wenn hIn ok ist
      {

        AllocConsole(); //Sprzielle Console für diesen Teil des Programmes benutzen
//Parameter für CreateProcess festlegen
STARTUPINFO          si = { sizeof(si) };
PROCESS_INFORMATION  pi;
char szExe[] = "cmd.exe";

    if(CreateProcess(0, szExe, 0, 0, FALSE, 0, 0, 0, &si, &pi))  //Process erstellen
       {
    DWORD k;
    char dir[3];
    WriteFile (hIn,dir,1024,&k,NULL);        
        }
     }



so in etwa sieht das ganze aus, und ich find den Fehler nicht Bitte helft mir noch einmal.

mfg
Kabel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.02.2006, 15:51 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


mach bInheritHandles an, also das FALSE in deinem CreateProcess ist falsch

dann musste in den StartupInfo's flags auf STARTF_USESTDHANDLES und dort drin auch deine handles entsprechend setzen.

Ansonsten zuerst AllocConsole aufrufen, dann GetStdHandle, sonst kriegst du nicht die Handles von der neuen Konsole, sondern evtl deine vorherigen (wenn du schon eine konsolenanwendung hast, brauchst du kein AllocConsole, solltest aber mit DuplicateHandle deine Std-Handles duplizieren jeweils.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.02.2006, 17:53 Uhr
Kabel



Hallo,

ich danke dir für deine Hilfe. Ich hab jetzt alles geändert was du gesagt hast, nur mit dem STATF_USESTDHANDLES komm ich nicht wirklich klar, könntest du mir das bitte noch einmal erklären? Ich hab auch gegooglt usw aber irgendwie weiss ich nicht wirklich wo anfangen zu suchen, überall fällt der Bergriff, aber ich finde nicht raus wie ich das bei meinem Projekt anwenden könnte.

Hier nochmals den Code mit meinen Änderungen:

C++:
AllocConsole();
        HANDLE hIn;
        hIn = GetStdHandle(STD_INPUT_HANDLE);
        if (hIn != INVALID_HANDLE_VALUE)
        {

STARTF_USESTDHANDLES{};
STARTUPINFO          si = { sizeof(si) };
PROCESS_INFORMATION  pi;
char                 szExe[] = "cmd.exe";

if(CreateProcess(0, szExe, 0, 0, TRUE, 0, 0, 0, &si, &pi))

    DWORD k;
    char dir[3];
    WriteFile (hIn,dir,1024,&k,NULL);        
    

      }
}



Könntest du mir bitteschnell erläuteren was genau ich in diesen

STARTF_USESTDHANDLES{}; schreiben muss? Nochmals die ganzen Handels oder nur eine art Hinweis was benutzen? WIe soll das aussehen?
Es tut mir Leid dass ich so oft nachfrage aber irgendwie find ich keine Infos dazu im Inet :/

Würde ich (wiedermal) über Hilfe freuen,

mfg
Kabel

Dieser Post wurde am 14.02.2006 um 21:47 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.02.2006, 21:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



C++:
STARTUPINFO si;
si.size = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = ...
si.hStdOutput = ...
si.hStdError = ...



Achja zu dem Thema gibts ein gutes aber erstmal etwas verwirrendes Beispiel in der MSDN: "Creating a Child Process with Redirected Input and Output"
--
class God : public ChuckNorris { };

Dieser Post wurde am 14.02.2006 um 21:52 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: