Videoclip mit Standardanwendung öffnen lassen



  • Hallo,

    ich möchte per Button-Click einen Videoclip mit der Standardanwendung öffnen.

    Damals als ich noch in VB.Net programmierte, konnte man eine Videodatei per Pfadangabe mit dem Standardprogramm öffnen lassen. Quasi wie wenn ich einen Doppelklick auf die Videodatei ausführe. Der Code bestand nur aus einer Zeile.

    Das ist doch in C++ auch möglich, weiß jemand wie ich das anstelle?

    P.S.: Ich arbeite mit Qt.

    Vielen Dank!



  • Ich habe es bereits selber herausgefunden. Zuerst habe ich es in der Kommandozeile ausprobiert und dann auf C++ übertragen:

    system("\"PFAD\"");
    

    Der Dateipfad der Videodatei muss in Anführungszeichen eingebettet sein. Deshalb benötigt man für die Anführungszeichen Backslashes, für die dies noch nicht wissen.



  • Mit Qt hätte ich auf QDesktopServices getippt. Das ist dann auch Crossplattform, falls es mal nicht Windows sein soll.



  • @DerDaVinciKot sagte in Videoclip mit Standardanwendung öffnen lassen:

    Der Dateipfad der Videodatei muss in Anführungszeichen eingebettet sein.

    Nur wenn er Leerzeichen enthält.



  • Unter Windows gibt es die ShellExecute Funktion bzw. ein paar weitere Funktionen aus der Familie. Mit "open" als loOperation sollte Windows die Standardanwendung für die Datei finden und die Datei damit öffnen.



  • Danke für Eure Tipps!

    Ein anderes Problem:
    Ich möchte ein Bild in ein QLabel laden. Grundsätzlich kein Problem wenn ich den kompletten Pfad angebe. Wenn ich die Datei aber aus Release-Ordner laden will, funktioniert das nicht.

    Beispiel:
    ich stelle Qt-Ausführung auf "Release" ein. Im Release-Ordner füge ich nun zwei Ordner - Ordner1 und Ordner2 ein. Der Ordner2 befindet sich in Ordner1. Und im Ordner2 befindet sich die Bilddatei.

    Die Bild-Datei befindet sich also in:
    Build-ReleaseOrdner/Release/Ordner1/Ordner2/Bild.jpg

    Ich kann aber anscheinend nicht darauf zugreifen bzw. irgendwo ist noch ein Fehler:

    QImage image("Ordner1\\Ordner2\\Bild.jpg");
        ui->imgLabel->setPixmap(QPixmap::fromImage(image));
        ui->imgLabel->resize(300, 300);
    
    Was habe ich falsch gemacht?
    

    Ich habe den Fehler gefunden. Ausgangspunkt ist nicht der release-Ordner sondern der Build-Release Ordner (also der übergeordnete Ordner). Richtig wäre also:

    QImage image("release\\Ordner1\\Ordner2\\Bild.jpg");
    

    Jetzt stellt sich mir aber eine andere Frage: Wie wird das am Ende in der Praxis umgesetzt? Nehmen wir mal an, das Programm ist soweit fertig und soll außerhalb von Qt genutzt werden. Dann fällt doch der release-Ordner weg? Richtig wäre ja z.B.:

    "Hauptordner_mit_Anwendung\Ordner1\Ordner2"

    Dann ist die Anweisung

    QImage image("release\\Ordner1\\Ordner2\\Bild.jpg");
    

    aber wieder nutzlos, da es keinen release-Ordner gibt. Irgendwie habe ich gerade einen Knoten.

    Ich habe es jetzt mit QCoreApplication::applicationDirPath() gelöst.



  • @DerDaVinciKot sagte in Videoclip mit Standardanwendung öffnen lassen:

    Ein anderes Problem:

    Anderes Problem, anderer Thread.



  • @DerDaVinciKot sagte in Videoclip mit Standardanwendung öffnen lassen:

    Ich habe es jetzt mit QCoreApplication::applicationDirPath() gelöst.

    👍
    Genau so macht man das auch.
    Denn du willst ja nicht vom "working directory" abhängig ein mit dem dein Programm gestartet wurde. Denn das muss nicht das selbe Verzeichnis sein wo deine .exe liegt.



  • Gibt es eigentlich bestimmte Zeichen die man nicht verwenden darf um eine Datei bzw. in meinem Fall ein Videoclip per

    system()
    

    zu öffnen? Mir ist aufgefallen, das Dateien mit Umlauten im Titel nicht geöffnet werden können. Das mit den Umlauten klingt ja noch plausibel, aber mir ist aufgefallen das Titel mit mehreren Punkten (z.B. "Dies ist ein ... Beispieltitel") ebenfalls nicht geöffnet werden. Gibt es dafür eine Erklärung?



  • system("foo bar baz.mp4") macht so ziemlich das selbe wie wenn du foo bar baz.mp4 in der Kommandozeile eintippst.
    Da hier Leerzeichen enthalten sind, wird Windows also nach einem Programm namens foo suchen - und vermutlich keines finden.

    Wenn du willst dass das Video foo bar baz.mp4 geöffnet wird, musst du dem ganzen nochmal ein Paar Anführungszeichen spendieren: system("\"foo bar baz.mp4\"")

    Mit den Punkten sollte das normalerweise nichts zu tun haben.

    Davon abgesehen würde ich dir empfehlen ShellExecute/ShellExecuteEx statt system zu verwenden.



  • Ich hatte es ja mit Anführungszeichen versucht. Aber bei Titeln mit Umlauten oder mehreren Punkten (...) funktionert es komischer Weise nicht. Ich habe das mehrmals überprüft und auch keine Tippfehler gemacht. Sobald ich die drei Punkte oder Umlaute entferne, funktioniert alles wunderbar.



  • Ja, pfuh, keine Ahnung.
    Aber wie gesagt: nimm ShellExecute/ShellExecuteEx.



  • Wenn eh Qt verwendet wird, dann gibt es auch was von Qt
    QDesktopServices::openUrl



  • @DerDaVinciKot sagte in Videoclip mit Standardanwendung öffnen lassen:

    aber mir ist aufgefallen das Titel mit mehreren Punkten (z.B. "Dies ist ein ... Beispieltitel") ebenfalls nicht geöffnet werden. Gibt es dafür eine Erklärung?

    #include <cstdlib>
    int main()
    {
    	std::system("\"Dies ist ein ... Beispieltitel.jpg\"");
    }
    

    tut bei mir genau was es soll.

    @DerDaVinciKot sagte in Videoclip mit Standardanwendung öffnen lassen:

    Mir ist aufgefallen, das Dateien mit Umlauten im Titel nicht geöffnet werden können.

    und

    #include <cstdlib>
    int main()
    {
    	std::system("\"Dies ist ein ... äh ... Beispieltitel.jpg\"");
    }
    

    das auch.



  • Sehr interessant! Mal wieder so ein mysteriöses Phänomen. Sowas macht mich verrückt! Danke für die Mühe. Ich werde mal schauen ob ich es mit ShellExecute hinbekomme, ansonsten muss ich halt auf Umlaute und die pööhsen Punkte verzichten.

    Aber mal ein anderes Thema zur Abwechslung:
    Kann mir jemand verraten, wie ich ein Icon für das Desktop-Symbol meiner Anwendung setzen kann, so dass ich nicht immer dieses Standard Symbol auf dem Desktop sehe, sondern ein eigenes? Damit meine ich nicht das windowIcon, sondern welches man im Explorer sehen kann.

    Danke 🙂



  • @DerDaVinciKot Generell gilt: Eine Frage/ein Thema pro Thread und ein Thread pro Frage/Thema.

    Shell Links - Creating a Shortcut and a Folder Shortcut to a File
    IShellLinkA interface (shobjidl_core.h)



  • @DerDaVinciKot sagte in Videoclip mit Standardanwendung öffnen lassen:

    Kann mir jemand verraten, wie ich ein Icon für das Desktop-Symbol meiner Anwendung setzen kann

    Wenns für die .exe ist: IIRC ist das Icon das für eine .exe angezeigt wird einfach die erste Icon-Resource die in der .exe enthalten ist. Oder war es die mit der niedrigsten ID? Weiss nimmer genau. Auf jeden Fall sollte es funktionieren wenn es die 1. Resource ist und du ID 1 verwendest.

    Die genauen Regeln sollten sich aber relativ einfach ergoogeln lassen.



  • @DerDaVinciKot sagte in Videoclip mit Standardanwendung öffnen lassen:

    Sehr interessant! Mal wieder so ein mysteriöses Phänomen. Sowas macht mich verrückt!

    Ich glaube ich weiß was los ist. Öffne mal das betreffende Source-File mit Notepad++ und check ob das im ANSI Encoding gespeichert ist.



  • @Swordfish Das mit den Umlauten könnte ich mir mit Encoding-Unterschieden erklären. Aber das mit den Punkten?



  • Ich habe folgendes der pro.Datei hinzugefügt:

    win32{
    RC_FILE = myApp_resource.rc
    }

    und die resource.rc-Datei

    IDI_ICON1 ICON DISCARDABLE "[...]\myApp\myappico.ico"

    Nun erscheint aber folgende Fehlermeldung:
    No rule to make target '../myApp/myApp_resource.rc', needed by 'release/myApp_resource_res.o'. Stop.

    Zum ANSI-Problem komme ich noch, sobald das Problem mit dem Icon weg ist, sonst kann ich nicht erstellen.

    UPDATE:
    So, endlich habe ich es mit dem Icon geschafft!!! Ich habe die .rc-Datei vom Release-Ordner in den "Normalen" Projektordner getan. Kann mir jemand erklären wie das zustande kommt? Ich dachte immer, wenn ich auf "Release" einstelle, muss alles im Release-Ordner sein.

    Wie erstellt man eigentlich die .rc-Datei? Ich weiß nicht wie ich das genau geschafft habe dass sie angelegt wird...

    Zum ANSI-Problem: Wenn ich die mainwindow.cpp mit Notepad öffne, werden die Umlaute korrekt angezeigt. Somit sollte das Problem ausgeschlossen sein, oder?


Log in to reply