"öffnen mit" ändert Arbeitsverzeichnis von SDL/Konsolenprogramm



  • Hallo
    Ich möchte Dateien auf meine .exe ziehen können so dass diese dann geöffnet werden. Oder halt Rechtsklick auf Datei -> "öffnen mit" -> Programm.exe auswählen. Die Dateinamen stehen dann ja in argv[] (Parameter von main)

    Problem ist, wenn das Programm so aufgerufen wird ändert sich das Arbeitsverzeichnis. Das heisst zB cout schreibt nicht mehr in den Ordner wo auch die Programm.exe liegt sondern in E:\Dokumente und Einstellungen\Benutzername und alle Dateiladefunktionen wollen von da lesen.

    Den Programmpfad könnte ich ja aus argv[0] bekommen.
    Aber muss ich jetzt wirklich jedes fopen ("log.txt"), SDL_LoadBMP ("bild.bmp") etc als fopen (programmpfad + "log.txt") schreiben?
    Ist das der beste Weg?

    Gefunden hab ich noch SetCurrentDirectory aber naja, braucht wohl Kernel32.lib, Kernel32.dll und Windows.h

    Gibt es da noch bessere Möglichkeiten?

    ps: parameter von main wäre vielleicht auch was für die faq



  • Hallo Dragqueen,

    nun, grundsätzlich versuche ich in meiner Software immer mit einem kompletten Pfad zu arbeiten.
    Also Laufwerksbuchstabe plus Pfad plus Dateiname (inkl. Extension)

    Das hört sich nach Mühsal an, erspart Dir aber Ärger wie Du eben beobachtet hast. Erst recht, wenn Deine Software in einer Netzwerkumgebung arbeitet 😮

    Du kannst z.B. den aktuellen Pfad (mit Dateinamen) Deines Programms mit GetModuleFileName() ermitteln,
    das aktuelle Arbeitsverzeichnis (ohne Dateinamen) mit GetCurrentDirectory() ermitteln.

    Windows bietet Dir viele Hilfsfunktionen (in shlwapi.dll ab Version 4.71), wie z.B.:
    PathAddExtension()
    PathRemoveExtension()
    PathAppend()
    PathRemoveFileSpec()
    PathAddBackslash()
    PathFileExists()
    usw...

    Zu finden sind die unzähligen "Shell Path Handling Functions" unter http://msdn.microsoft.com/en-us/library/bb773559(VS.85).aspx

    Ich persönlich nutze diese Funktionen, da sie intern oftmals eingebaute Überprüfungen oder auch automatische Korrekturen durchführen.
    Selbst das simple Anhängen einer Unterverzeichnis-Ebene '\' überlasse ich der Funktion PathAddBackslash(), denn sie überprüft automatisch, ob am Ende des Pfadnamens bereits ein '\' enthält. usw

    HTH
    Martin

    P.S.: Die Parameter von main() sind in der MSDN gut beschrieben:
    "Argument Definitions" http://msdn.microsoft.com/en-us/library/88w63h9k.aspx



  • Hallo
    danke für die ausführliche Antwort.
    Da gibt es ja sogar Sachen zum arbeiten mit URLs, zum Beispiel UrlEscapeSpaces.
    Eigentlich wollte ich ohne windows includes auskommen aber viele Funktionen erscheinen doch recht nützlich.
    Danke!


Log in to reply