File öffnen durch Doppelklick ->.exe starten -> Datei laden



  • Hallo zusammen,

    habe leider keinen passenderen und kürzeren Titel für mein Problem gefunden...

    Folgendes Problem:

    Ich schreibe eine .exe und die erzeugt Dateien, die auf die Festplatte gespeichert werden. Ich nehme Registry Einträge vor, das diesen Dateien die "Öffnen mit..." Eigenschaft verpasst und diese durch Doppelklick die .exe starten.

    Wie kann das Programm jetzt so steuern, dass es unterscheiden kann, ob es durch Doppelklick auf die .exe oder durch Doppelklick auf die Datei geöffnet wurde?
    Falls durch Doppelklick auf .exe soll es nichts weiter machen, bei Doppelklick auf die Datei muss sie durch das Programm eingelesen werden.

    Vielen Dank und liebe Grüße
    Todd



  • Hallo

    Siehe FAQ.

    bis bald
    akari



  • Danke für den Link.

    Ich hab jetzt folgendes in die Registry hineingeschrieben:

    exepath=ExtractFilePath(Application->ExeName);
    TRegistry* pReg = new TRegistry;
     try {pReg->RootKey = HKEY_CLASSES_ROOT;
          pReg->OpenKey(".tmat",true);
          pReg->WriteString("","tmatfile");
          pReg->CloseKey();
          pReg->OpenKey(".tmat\\OpenWithList\\tlab.exe",true);
          pReg->WriteString("","");
          pReg->CloseKey();
          pReg->OpenKey("tmatfile",true);
          pReg->WriteString("","tlab data file");
          pReg->CloseKey();
          pReg->OpenKey("tmatfile\\DefaultIcon",true);
          pReg->WriteString("",exepath+"\\Symbole\\tmat.ico,0");
          pReg->CloseKey();
          pReg->OpenKey("tmatfile\\Shell\\open\\command",true);
          pReg->WriteString("",exepath +"tlab.exe %1");
          pReg->CloseKey();}
     catch(...)
     {delete pReg;}
     delete pReg;
    

    Und mir folgende Zeilen ausgeben lassen:

    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
     if (ParamStr(1)!="")
        {for (int i=0;i<=ParamCount();i++)
              Memo1->Lines->Add(ParamStr(i));}
    }
    

    und bekomme als Resultat:

    C:\Dokumente und Einstellungen\Todd\Desktop\Diplomarbeit\C++ Builder\x\tlab.exe
    C:\DOKUME1\Todd\Desktop\DIPLOM1\C__BUI1\x\WORKSP1\C674B~1.TMA

    Die Datei, die ich öffne heisst: c.tmat

    Meine Frage: Wie bekomme ich jetzt den Namen dieser Datei extrahiert? "c"

    Hab schon alles versucht, aber mit der zweiten Ausgabe von oben, d.h. ParamStr(1) komme ich nicht weiter

    Vielen Dank und liebe Grüße
    Todd



  • Hallo

    Nein die Datei die du mit deinen Programm öffnest heißt C674B~1.TMA

    /Edit : Wenn das die Windows-übliche zusammenfassung in 8.3 Namen ist dann kannst du diesen Dateinamen auch weiterverwenden, Windows weiß schon welche Datei damit gemeint ist.

    bis bald
    akari



  • Ja du hast Recht, Windows weiss welche Datei gemeint ist. Das Öffnen ist ja auch kein Problem, das funktioniert reibungslos. Ich hab aber eine ListBox, wo die Datei mit Namen gelistet wird.

    D.h. im Ordner liegt eine Datei namens c.tmat...
    Bei Doppelklick auf c.tmat öffnet tlab.exe die Datei und liest sie ein (Matrix).
    ParamStr(1) liefert mit als Namen "C674B~1"
    Mit diesem Namen kann ich allerdings nicht viel Anfangen, weil ich den Namen der Datei anzeigen muss, in der ListBox und als Überschrift eine TStringGrids. Da kann ich doch nicht "C674B~1" anzeigen lassen...

    Auf jeden Fall decken sich die ersten Zeichen des "ParamStr-Namens" ->C... mit denen, die im Ordner angezeigt werden "C".

    Jetzt fehlt mir nur noch eine Information, ob es eine Regel gibt, bei der Vergabe des von ParamStr angezeigten Namens und dem, der im Ordner angezeigt wird.

    Dann könnte man ja den ersten Teil extrahieren und den rest löschen. Nur weiss ich nicht bis zu welchem...

    Liebe Grüße
    Todd



  • Hallo

    Aus der MSDN zu GetShortFileName :

    You can obtain the long name of a file from the short name by calling the FindFirstFile function.

    Du kannst auch die VCL-Funktion FindFirst nehmen.

    bis bald
    akari



  • Danke für deine Hilfe...

    Habe es jetzt folgendermaßen gelöst:

    AnsiString filename;
    GetLongPathName(ParamStr(1).c_str(),filename.c_str(),500);
    

    jetzt ist in filename.c_str() folgendes gespeichert:

    C:\Dokumente und Einstellungen\Todd\Desktop\Diplomarbeit\C++ Builder\x\workspace\c.tmat

    Nochmals vielen Dank für deine Hilfe und liebe Grüße

    Todd



  • So darfst du das nicht machen, du schreibst in uninitialisierten Speicher, da der AnsiString vor Aufruf der Funktion leer ist.
    Du nimmst am besten ein char-Array und kopierst anschließend die Daten in einen AnsiString.

    char cLongName[MAXPATH];
    GetLongPathName(ParamStr(1).c_str(), cLongName, MAXPATH); 
    AnsiString filename(cLongName);
    


  • Th schrieb:

    So darfst du das nicht machen..

    Doch, kann er, wenn folgendes macht:

    [code]
      AnsiString filename = String::StringOfChar(' ',500); 
      GetLongPathName(ParamStr(1).c_str(),filename.c_str(),500);
    
    [/code]
    

    Aber deine Lösung ist natürlich auch ok. 😉



  • Dadurch verhinderst du zwar, dass in nicht initialisierten Speicher geschrieben wird. Zulässig ist das aber nicht. Die Funktion c_str() ist const. Man darf also nicht da rein schreiben. In der Hilfe gibt es auch ein Beispiel mit einer entsprechenden Warnung.



  • Okay, danke für die Hinweise...

    Es funktioniert zwar wie ich es geschrieben habe, aber falls es doch unschön, bzw. zu Konflikten führen kann, werde ich den Vorschlag von TH aufgreifen und es so ausprobieren...

    Danke für eure Hilfe und Liebe Grüße

    Todd


Anmelden zum Antworten