Announcement

Collapse
No announcement yet.

.bat aus C++ Anwendung aufrufen bzw. ausführen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • .bat aus C++ Anwendung aufrufen bzw. ausführen

    Hallo,

    wie kann man eine .bat aus C++ Anwendung aufrufen bzw. ausführen?

    Gruss

    Thomas

  • #2
    ShellExecute<p>
    Schöne Grüße, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      Hallo Mario,

      vielen Dank für die Info! Die Batch Datei kann ich jetzt aufrufen, das einzige Problem ist, dass sich die cmd.exe sofort wieder schließt. Wie kann ich die cmd.exe offen lassen?
      Ich starte das Programm so:

      HWND Handle = {"C:\\WINDOWS\\System32\\cmd.exe"};
      int aus=(int)ShellExecute(Handle,"open","D:\\hopf.bat" ,NULL,NULL,SW_SHOWNORMAL);

      Ne Idee?
      Gruss
      Thoma

      Comment


      • #4
        Warum soll die Kommandozeile denn offen bleiben, soll der Anwender noch irgendwelche Sachen eingeben?<p>
        Kannst Du mir kurz erklären, was der Befehl macht:<br>
        <i>HWND Handle = {"C:\\WINDOWS\\System32\\cmd.exe"}</i><p>
        Schöne Grüße, Mario Noac
        Schöne Grüße, Mario

        Comment


        • #5
          Hi,
          ich glaube, Du hast da ein Parameter vertauscht:

          das Handle sollte das Handle des Fensters sein, dass die batch-Datei aufruft, also z.B. HWND(this) bzw. HWND(Form1) oder wie auch immer das Fenster der Hauptanwendung heißt.

          <PRE>
          HWND Handle = {"c:\windows..usw."};
          </PRE>
          Die Blockklammern sind überflüssig, und dann gibt Handle wohl den Zeiger auf das Zeichenarray für den String "c:\windows..." zruück. Der hat in der ShellExecute Anweisung natürlich nix zu suchen ;-)

          cmd wird beim Aufruf der Batch-Datei wahrscheinlich automatisch als Befehlsinterpreter gestartet.

          zu den Paramtern:
          http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp

          Zum Fenster offenlassen:
          Entweder du fügst deiner Batch-Datei den Befehl PAUSE hinzu (dh erst nach Tastendruck schließt sich das Fenster) oder du nutzt eine der Optionen der Shell:

          http://www.rz.fh-ulm.de/rz/winnt/cmd.htm

          Für deinen Fall ist, denke ich, /K der passende.
          Also:
          <PRE>
          HINSTANCE aus = ShellExecute(this, "open", "cmd.exe", " /K d:\\hopf.bat", NULL, SW_SHOWNORMAL);
          </PRE>

          Gruß, Marti

          Comment


          • #6
            ... im letzteren Fall müsstest Du beachten, dass es unter Win9x die cmd nicht gibt, sondern dort command heißt und vermutlich andere Parameter hat.<p>
            Grüße, Mari
            Schöne Grüße, Mario

            Comment


            • #7
              Vielen Dank Jungs!

              Das mit HINSTANCE aus = ShellExecute(this, "open", "cmd.exe", " /K d:\\hopf.bat", NULL, SW_SHOWNORMAL); funktioniert einwandfrei! Die cmd.exe bleibt offen!

              Nur eines noch: wie kann ich die cmd.exe dann von meiner Anwendung aus zu einem späteren Zeitpunkt wieder schließen?

              Gruss
              Thoma

              Comment


              • #8
                Hallo!

                Ich hab es jetzt!

                Also geöffnet wird wie oben beschrieben mit:

                ShellExecute(this, "open", "cmd.exe", " /K c:\\hopf.bat", NULL, SW_SHOWNORMAL);

                Schließen kann man dann mit:

                HWND Handle = FindWindowEx(0,0,NULL,PChar("C:\\WINDOWS\\System32 \\cmd.exe"));
                if(Handle != 0)
                {
                SendMessage(Handle, WM_CLOSE,0,0);

                }

                Super!!!!!!

                Bis dann!

                Gruss
                Thoma

                Comment


                • #9
                  Du schließt dann natürlich unter Umständen eine cmd.exe, die der Anwender mutwillig geöffnet hat?! Vermutlich ist dies aber verschmerzbar?<p>
                  Falls nicht, solltest Du zu CreateProcess wechseln. Hier ein Beispiel aus dem MSSDK:<p>
                  <pre>void main( VOID )
                  {
                  STARTUPINFO si;
                  PROCESS_INFORMATION pi;

                  ZeroMemory( &si, sizeof(si) );
                  si.cb = sizeof(si);
                  ZeroMemory( &pi, sizeof(pi) );

                  // Start the child process.
                  if( !CreateProcess( NULL, // No module name (use command line).
                  "MyChildProcess", // Command line.
                  NULL, // Process handle not inheritable.
                  NULL, // Thread handle not inheritable.
                  FALSE, // Set handle inheritance to FALSE.
                  0, // No creation flags.
                  NULL, // Use parent's environment block.
                  NULL, // Use parent's starting directory.
                  &si, // Pointer to STARTUPINFO structure.
                  &pi ) // Pointer to PROCESS_INFORMATION structure.
                  )
                  {
                  ErrorExit( "CreateProcess failed." );
                  }

                  // Wait until child process exits.
                  WaitForSingleObject( pi.hProcess, INFINITE );

                  // Close process and thread handles.
                  CloseHandle( pi.hProcess );
                  CloseHandle( pi.hThread );
                  }</pre><p>Schöne Grüße, Mario Noac
                  Schöne Grüße, Mario

                  Comment

                  Working...
                  X