externes Programm starten



  • Ich möchte von meinem Programm aus ein anderes starten, wie mache ich das ?

    [ Dieser Beitrag wurde am 11.07.2002 um 17:57 Uhr von Jansen editiert. ]



  • Schreibt mal bitte jemand ein schönes ShellExecute-Beipiel, damit wir das in die FAQ packen können? Danke! 😉

    In der Zwischenzeit hilft dir vielleicht das hier: http://www.bcbdev.com/faqs/faq71.htm

    [ Dieser Beitrag wurde am 10.07.2002 um 12:57 Uhr von Jansen editiert. ]



  • Muss es unbeding ShellExecute sein ?
    Ich bevorzuge eher CreateProcess, da man dort den Status des Programms herausfinden kann, z.Bsp. ob es noch läuft usw.

    HANDLE ExecuteProcess( const String & CommandLine, const String & WorkDir )
    {
       STARTUPINFO sStartInfo;
       ZeroMemory( &sStartInfo, sizeof(STARTUPINFO) );
       sStartInfo.cb = sizeof(STARTUPINFO);
       sStartInfo.wShowWindow = SW_SHOWDEFAULT;
       sStartInfo.dwFlags = STARTF_USESHOWWINDOW;
    
       PROCESS_INFORMATION sProcessInfo;
       ZeroMemory( &sProcessInfo, sizeof(PROCESS_INFORMATION) );
    
       bool ok = CreateProcess( NULL, CommandLine.c_str(),
                               NULL, NULL, true,
                               NORMAL_PRIORITY_CLASS, NULL, WorkDir.c_str() , &sStartInfo, &sProcessInfo );
    
       if ( !ok ) {
          sProcessInfo.hProcess = 0;
       }
       return sProcessInfo.hProcess;
    }
    

    Aufruf z.Bsp.:

    // im Header ...
    HANDLE hNote;
    // im CPP on Button
    hNote = ExecuteProcess( "notepad", GetCurrentDir() );
    notetimer->Enabled = true;
    // im on notetimer
    if ( hNote ){
       DWORD noteExitCode;
       if ( GetExitCodeProcess(hNote , ¬eExitCode) ) {
          if ( noteExitCode== STILL_ACTIVE ) {
             // immer noch an
          }
          else {
             // Programm beendet
             notetimer->Enabled = false;
             CloseHandle( hNote );
         }
       }
    }
    

    Natürlich schreibe ich auch gern mal ein Shellexecute 😉

    mfg
    Dis



  • Ich bevorzuge eher CreateProcess

    Kanonen auf Spatzen? Zumindest in den meisten Fällen, oder?

    Natürlich schreibe ich auch gern mal ein Shellexecute

    Ja, bitte! 🙂



  • sowas?

    void execute(AnsiString ziel)
    {
      long i;
      i=long(ShellExecute(0, "open", ziel.c_str(), 0, 0, SW_SHOWNORMAL));
    
      //Fehlerabfang
      if(i <= 32)
      {
       if ( (i == SE_ERR_ACCESSDENIED) || (i == SE_ERR_SHARE) )
        Application -> MessageBox("Die Datei wird bereits verwendet!",
          "Kommunikation", MB_OK + MB_ICONERROR);
       else if ( (i == SE_ERR_ASSOCINCOMPLETE) || (i == SE_ERR_NOASSOC) )
        Application -> MessageBox("Die Dateiendung ist mit keinem Programm verknüpft!","Kommunikation", MB_OK + MB_ICONERROR);
       else
        Application -> MessageBox("Ein unerwarteter Fehler trat auf!"
          , "Kommunikation",MB_OK + MB_ICONERROR);
      }
    }
    


  • Wie geht ShellExecute bei Programmen wie net.exe ?
    Da muss ich ja noch mehr angeben
    (z.B.net use f: \\name\c$ "kennwort" /Domäne\USER: uname).



  • Hast du dir schon mal die Hilfe zu ShellExecute angesehen!?



  • hmpf... ich hab schon dutzende mal meine ShellExecute-Funktion gepostet und niemand wollte sie! 😉

    // forward-deklaration in nem header:
    void RunApplication(LPCTSTR FileName, LPCTSTR FileParam);
    
    // führt per ShellExecute die Anwendung, die mit der Dateiendung von FileName
    // assoziert ist aus, FileParam spezifiziert zusätzliche Aufrufparameter
    void RunApplication(LPCTSTR FileName, LPCTSTR FileParam)
    {
      int ret = (int) ShellExecute(0, "open", FileName, FileParam, 0, SW_SHOWNORMAL);
    
      if (ret <= 32)
      {
        AnsiString msg;
    
        switch(ret)
        {
          case ERROR_FILE_NOT_FOUND, SE_ERR_FNF :
                 msg = "Die angegebene Datei '" + AnsiString(FileName) + "' wurde nicht gefunden!";
                 break;
    
          case ERROR_PATH_NOT_FOUND, SE_ERR_PNF :
                 msg = "Der Pfad zur Datei '" + AnsiString(FileName) + "' wurde nicht gefunden!";
                 break;
    
          case ERROR_BAD_FORMAT :
                 msg = "Die aufgerufene Anwendung ist ungültig oder beschädigt!";
                 break;
    
          case SE_ERR_ACCESSDENIED, SE_ERR_SHARE :
                 msg = "Der Zugriff auf die Datei '" + AnsiString(FileName) + "' wurde vom Betriebssystem verweigert!";
                 break;
    
          case SE_ERR_ASSOCINCOMPLETE, SE_ERR_NOASSOC :
                 msg = "Der angegebene Dateityp ist auf Ihrem Computer keiner Anwendung zugeordnet!";
                 break;
    
          case 0, SE_ERR_OOM :
                 msg = "Zum Ausführen der Anwendung ist nicht genügend Arbeitsspeicher frei!";
                 break;
    
          default : msg = "Datei '" + AnsiString(FileName) + "' konnte nicht geöffnet werden!";
        }
    
        Application->MessageBox(msg.c_str(), "Fehler", MB_OK + MB_ICONERROR);
      }
    }
    

    aufruf-beispiele:

    // ohne parameter
    RunApplication("meine.exe", 0);
    RunApplication("mailto:magic_sunday@gmx.de", 0);
    RunApplication("http://www.magic-sunday.de", 0);
    
    // mit parameter
    RunApplication("meine.exe", "1 2 3");
    RunApplication("net", "use");
    RunApplication("format", "a: /s");
    
    // aufruf bei AnsiString-Übergabe
    AnsiString FileName = "c:\\windows\\calc.exe";
    RunApplication(FileName.c_str(), 0);
    

    [ Dieser Beitrag wurde am 10.07.2002 um 14:59 Uhr von Sunday editiert. ]



  • ich hab schon dutzende mal meine ShellExecute-Funktion gepostet und niemand wollte sie!

    Naja, aber nu! Und späte Einsicht ist besser als gar keine, oder? 🙂

    Wie wär's, wenn noch die von Vlad Tepes angesprochene Parameter-Übergabe mit eingearbeitet wird, damit das wirklich eine Komplettlösung ist?



  • Das ist cool. Vielen Dank schon mal.



  • so geänderte version! nun mit paramter-möglichkeit.

    siehe vorigen post von mir... 😉



  • Ich würde noch nen bool-Parameter namens "Show" angeben. Soetwas kann man z.B. dann gebrauchen, wenn ein Programm in der Konsole gestartet wird, man es aber nicht sichtbar haben will.



  • Jansen :
    Kanonen auf Spatzen? Zumindest in den meisten Fällen, oder?

    Leider nicht 😉
    Denn die meisten kommen hinterher und fragen ob man nicht noch den Status des Programms noch abfragen kann (obs läuft oder nicht, usw).
    Außerdem finde ich, dass die Funktion nicht größer ist als die Shellexecute.

    Dis



  • Dann benutze du es. Die meisten wollen ShellExecute(). Mein Wort drauf. 😉

    Hihi, FAQ editieren ist lustig! Wenn man das Prog überwachen will, geht auch ShellExecuteEx. Abgeschrieben von -King- aus dem WinAPI-Forum:

    int main(void)
    {
      SHELLEXECUTEINFO sei;
    
        ZeroMemory((PVOID)&sei, sizeof(sei));
    
        sei.cbSize = sizeof(sei);
        sei.fMask  = SEE_MASK_NOCLOSEPROCESS;
        sei.nShow  = SW_SHOW;
        sei.lpFile = TEXT("notepad.exe");
    
        ShellExecuteEx(&sei);
    
        if(sei.hProcess)
        {
            WaitForSingleObject(sei.hProcess, INFINITE);
            CloseHandle(sei.hProcess);
        }
    
      return(0);
    }
    

    [ Dieser Beitrag wurde am 17.07.2002 um 01:32 Uhr von WebFritzi editiert. ]



  • naja, wenn man nur ein programm ausführen will oder ein .rtf oder .doc an word übergeben will, brauch man in der regel keine info über den laufenden status des programmes und ShellExecute reicht da vollkommen aus und jedesmal mit nem timer rum zu hantieren. ich weiss net...


Anmelden zum Antworten