Probleme mit ShellExecute



  • Hallo,
    folgendes Problem beschäftigt mich.
    Mit folgender Anweisung versuche ich mspaint.exe aufzurufen.

    void __fastcall TForm1::ToolButtonPaintClick(TObject *Sender)
    {
      AnsiString Path="C:\\WINDOWS\\system32\\mspaint.exe";
      AnsiString Param="C:\\Dokumente und Einstellungen\\IMG_6409.JPG";
      ShellExecute(0, "open", Path.c_str(),Param.c_str(), NULL, SW_SHOW);
    }
    

    Bekomme jedoch diese Fehlermeldung: C:\Dokumente.bmp wurde nicht gefunden.

    Erstelle ich ein Verzeichnis ohne Space im Verzeichnisnamen funktioniert der Aufruf einwandfrei. Wer sagt mir bitte, wie ich dieses Problem beheben kann. Freue mich auf Eure Hilfe und sage schon jetzt Danke für Hinweise.
    Gruß Egbert



  • den Paramterstring in Anführungszeichen setzen:

    String Param="\"C:\\Dokumente und Einstellungen\\IMG_6409.JPG\"";
    


  • hallo egbert,

    um unter windows systemen lange dateinamen verwenden zu können, insbesondere wenn leerzeichen im datei/ordner-namen sind, musst du diese mit "" umschliessen.

    hintergrund dazu, man könnte das leerzeichen ja auch als abschluß ansehen, welches ja auch bei dir geschehen ist.

    mfg



  • Hallo Christian, Hallo anonym001,
    zunächst vielen Dank für die Eure schnelle Antwort. Danke Christian, es klappt. Dieses Beispiel kommt allerdings bei mir etwas anders zur Anwendung. ich lese den Parameterpath aus einem img->Hint, wie hier im Code gezeigt.

    void __fastcall TForm1::AktuellesBildmitPaintffnen1Click(TObject *Sender)
    {
      char sWinDir[255];
      GetWindowsDirectory(sWinDir, sizeof(sWinDir));
    
      AnsiString Path=String(sWinDir)+"\\system32\\mspaint.exe";
      if (FileExists(Path))
      {
        if (Komponent!=NULL)
        {
          String ClName=String(Komponent->ClassName());
          if (ClName=="TImage")
          {
            TImage *img=dynamic_cast<TImage*>(Komponent);
    
    //        AnsiString Param=img->Hint; // wie ich den Path bisher einlese 
    
            String Param = ""+img->Hint+""; // hier der Versuch mit ""
    //     String Param = "\"+img->Hint+""; // hier der Versuch2 mit "" geht nicht!
            ShellExecute(0, "open", Path.c_str(),Param.c_str(), NULL, SW_SHOW);
          } else
          ShowMessage("Sie müssen das zu bearbeitende Bild zuvor anklicken!");
        } else ShowMessage("Zur Zeit ist kein Bild aktiv!");
      } else ShowMessage("Kann   "+Path+"\nnicht finden!"
                         "\n\nStellen Sie sicher, daß sich mspaint.exe "
                         "in diesem Verzeichnis befindet.");
    }
    

    Es kommt hier ebenfalls wieder die gleiche Fehlermeldung, wie zu Anfang beschrieben. Wie kann ich img->Hint in "" einbinden?
    Danke und prima, daß Ihr mir helft!!!
    Gruß Egbert



  • String Param = "\"" + img->Hint + "\"";
    

    Schon am SyntaxHighlighting erkennt man, ob richtig gequotet wurde.
    Praktikabler dürfte aber die Funktion QuotedStr() sein.



  • Hallo Moderator Jansen,
    Danke, es klapt 100% ...
    Verzeich mir bitte, bin halt kein Profi... Freue mich und bin dankbar für jede Hilfe hier im Super-Forum.
    Grüße Egbert



  • Hallo Jansen,
    habe nun mal die Funktion QuotedStr() eingebunden.

    String Param = QuotedStr(img->Hint);
    

    Funtioniert leider nicht. Folgende Fehlermeldung wird ausgegeben:

    C:\Dokument und Einstellungen\'C:\Dokumente.bmp enthält eine ungültige Pfadangabe

    Was mache ich hier falsch?
    Gruß Egbert



  • Sorry, mein Fehler, QuotedStr erzeugt nur einfache Anführungszeichen.
    Hättest du mit einem Blick in die Hilfe zwar auch selbst feststellen können ... 😉



  • Habe das schon in der Hilfe gelesen. Dachte aber, vielleicht lässt sich das halbe Anführungszeichen irgendwie ergänzen.
    Jedenfalls, noch mal recht herzlichen Dank und bis zu meinem nächsten Problem, bzw., wenn ich mal wieder nicht weiter weiß.
    Gruß Egbert



  • Es gibt aber auch die Funktion AnsiQuotedStr(). Hier läßt sich das gewünschte Anführungszeichen bestimmen.



  • Hallo Joe_M.
    Mit der Funktion AnsiQuotedStr() klappt es. Danke für den Hinweis!
    Gruß Egbert


Anmelden zum Antworten