Datei per Doppelklick öffnen



  • Hi,
    wie kann ich eine Datei per Doppelklick in eine Windows Forms Anwendung (C++.NET) öffnen? Die Datei soll dann in das richTextBox1 - Steuelement geladen werden. Danke für Hilfe



  • Doppelklick im Explorer? -> In Windows Registry registieren -> Falsches Forum



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Per Doppleklick öffnen funzt ja, ab die Datei soll ja in der Anwendung geladen werden. Mit MFC gehts aber die Anwendung läuft ja mit .NET Framework. Muss ja auch ne Funktion oder so was geben.



  • Tut mir leid, wenns im falschen Forum steht. Gibt ja keins mit C++.NET.



  • Wenn alle Dateien dieser Art die gleiche Dateiendung haben, und das Programm so konzipiert ist, dass der erste übergebene Parameter eine Datei dieser Art ist, kann ich helfen. Im folgenden eine noch zu editierende Reg-Datei, die dein Problem beheben sollte:

    REGEDIT4
    
    [HKEY_CLASSES_ROOT\.wasweisich] ; Dateiendung einsetzen (z.B. .txt)
    @="wasweisichfile"               ; 1
    
    [HKEY_CLASES_ROOT\wasweisichfile] ; 2
    ; 1, 2 und 3 unbedingt synchronisieren
    @="Beschreibender Kommentar" ; also in deinem Fall @="Windows Forms Application"
    
    [HKEY_CLASSES_ROOT\wasweisichfile\open\command] ; 3
    @="\"C:\\Pfad\\zum\\Programm\\bla.exe\" \"%1\"" ; richtigen Pfad einsetzen
    

    Rettich. Mit Dateiendung einsetzen ist gemeint, dass du dort das .wasweisich rausnimmst, bevor du die richtige Endung reinpackst. wenn du dir ganz viel Mühe geben willst, fügst du in den Ordner noch den SZ-Wert "MIME-Type" mit entsprechendem MIME-Typen ein. Des sollte es gewesen sein.
    Tschö,
    nullplan



  • Jo Danke, hat mir schon geholfen. Jetzt habe ich nur noch ein Problem:
    Der Datei-Pfad wird ja an die Anwendung übergeben und in einer Variable gespeichert. Wie kann man jetzt diese Variable auswerten und die Daten ind das richTextBox1-Element laden?. Beim Anfang des Programs (also bei der Parameterübergabe an das Programm) steht so was:

    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    

    In welcher Variable steht das jetzt und wie kann ich die verwenden?



  • Das steht in lpCmdLine. Hachja, zu DOS-Zeiten war das einfacher, da wurden noch argc und argv übergeben. In lpCmdLine steht erst einmal der Name deiner EXE samt Pfad und dahinter die Parameter. Da musst du erst mal einen Parser bauen, der dir dann argc und argv ausgibt. Falls du es nicht wissen solltest: argc ist ein int, der die Anzahl der übergebenen Parameter + 1 enthält, also im Prinzip die Wortzahl der lpCmdLine. argv ist eigentlich char* argv[] und enthält unter argv[i] den i-ten Parameter, wobei argv[0] Programmname und Pfad darstellen. Eben, wie es aufgerufen wurde.
    Na ja, wie du die lpCmdLine verarbeitest, bleibt dir überlassen. Das mit dem Parser... also ich würde es so machen, einfach weil argc und argv ein besseres Handling ermöglichen. Da du jedoch letztendlich nur den ersten Parameter brauchst, lokalisiere das zweite ", wenn lpCmdLine mit " beginnt, sonst lokalisiere das erste space. Alles was dahinter kommt, entweder durch " eingeschlossen, oder durch space beendet, ist der erste Parameter. Sollte nicht zu schwer werden.
    Tschö,
    nullplan



  • Vielen Dank. Ich werts ausprobieren!



  • Habe leider noch ein Problem:

    Ich hab jetzt einen parser geschrieben, doch so richtig funktioniert der nicht. Wenn sich den jemand anschauern könnte:

    System::String* argv(LPTSTR lpCmdLine)
    {
        String* delimStr = S" ";
        Char delimiter[] = delimStr->ToCharArray();
    
        System::String* split[] = lpCmdLine->ToString()->Split(delimiter);
    
        return split[0];
    }
    


  • Hmm... also hier ist meine Lösung:

    void getarg(char CmdLine[], int *argc,char* *argv[])
    {
      int i = 0;
      argc = 0;
      int numqu = 0;
      /* Bestimmung von argc */
      for (; i <= sizeof(CmdLine); i++)
      {
        if (CmdLine[i] == "\"") numqu++
        if ((CmdLine[i] == " ") && (numqu % 2)) argc++;
      }
      int x = 0;
      /* argv mache ich extra, weil ich die Schleifen gedanklich nicht zusammen 
       * bekommen habe
       */
      for (i = 0, numqu = 0; i <= sizeof(CmdLine); i++)
      {
        if (CmdLine[i] == "\"") numqu++;
        if (CmdLine[i] == " " && (numqu % 2)) x++;
        *argv[x] += CmdLine[i];
      }
    }
    

    Die Parameterübergabe da oben soll eigentlich einen ByVal- und zwei ByRef-Parameter darstellen. Naja, ich hab sowas lange nicht mehr genutzt. Vielleicht funzt es ja.
    Tschö,
    nullplan



  • Also bei mir kommen mind. ein dutzend Compilerfehler:

    __________________________________________________________________________

    Form1.cpp(15) : error C2446: '==': Keine Konvertierung von 'const char *' in 'int'
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Form1.cpp(15) : error C2040: '==': 'int' unterscheidet sich von 'const char [2]' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
    Form1.cpp(16) : error C2446: '==': Keine Konvertierung von 'const char *' in 'int'
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Form1.cpp(16) : error C2040: '==': 'int' unterscheidet sich von 'const char [2]' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
    Form1.cpp(24) : error C2446: '==': Keine Konvertierung von 'const char *' in 'int'
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Form1.cpp(24) : error C2040: '==': 'int' unterscheidet sich von 'const char [2]' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
    Form1.cpp(25) : error C2446: '==': Keine Konvertierung von 'const char *' in 'int'
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Form1.cpp(25) : error C2040: '==': 'int' unterscheidet sich von 'const char [2]' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
    __________________________________________________________________________

    Das verwundert mich ja sowiso, denn z.B. bei "error C2446" wird ja kein int-Wert in Char umgewandelt. Ist aber nicht so schlimm, dass es nicht klappt. Irgendwann werde ich das Problem lösen...

    Trotzdem Danke.


Anmelden zum Antworten