Pfad der .exe ermitteln -> Problem



  • Hallo zusammen,

    ich habe mal wieder ein Problem:

    Über meine Test.exe rufe ich durch klicken eines Buttons eine Update.exe auf, woraufhin die Test.exe geschlossen wird. Mit der Update.exe kann ich dann die Test.exe updaten und anschließend wieder starten. Beide exe-Dateien befinden sich im gleichen Verzeichnis. Damit die Update.exe die Test.exe nach dem Update wieder starten kann, muss hierzu der Pfad ermittelt werden. Dies habe ich mit

    CString strPfad = GetCommandLine();
    

    gemacht. Funktioniert soweit ich wunderbar. Den Pfad habe ich mir mal in einer MessageBox anzeigen lassen. Starte ich die Update.exe über den Windows-Explorer, ist der Pfad korrekt. Starte ich sie aber durch klicken des Buttons über die Test.exe, wird komischerweise der Laufwerkpfad abgeschnitten.

    Die exe-Dateien rufe ich mit dem Befehl _execl auf.

    Könnt ihr mir hier weiterhelfen?

    Danke.

    Gruß
    Flo





  • Habe es auf diese Art und Weise auch schon versucht, aber das Problem besteht leider immer noch.


  • Mod

    Was für ein Fehler besteht noch?
    Was hast Du probiert?

    Der Beitrag, den ich geschrieben habe sollte das Ganze doch weigehend erklären!



  • Hallo Martin,

    den Pfad zu ermitteln stellt nur bedingt ein Problem dar. Habe es so gemacht, wie du in einem anderen Thread beschrieben hast:

    // Kompletten Pfad der Anwendung ermitteln
    CString strPath; 
    ::GetModuleFileName(NULL, CStrBuf(strPath,_MAX_PATH), _MAX_PATH); 	
    
    // Dateierweiterung abschneiden 
    strPath.GetBufferSetLength(strPath.ReverseFind('\\'));
    

    Nun mein Problem:

    1. Starte ich die Update.exe über den Explorer, lautet mein Pfad: "C:\User\Test" , so ist er korrekt

    2. Starte ich aber nun zuerst meine Test.exe und über die Test.exe die Update.exe, lautet der Programmpfad ":\User\Test", also hier fehlt der Laufwerksbuchstabe C.

    Nun meine Frage, warum funktioniert es bei 1. bzw warum fehlt bei 2. der Laufwerksbuchstabe?


  • Mod

    Was Du schreibst kann nicht sein. GetModuleFileName liefert den Namen des geladenen Moduls.

    Dieses lässt sich IMHO extern nicht beeinflussen, außer Dein Programm zerschießt irgndwie den Speicher.

    Wie startest Du Deine Update-EXE?



  • Hiermit starte ich meine Update.exe, was auch noch gleichzeitig überprüft, ob diese im entsprechenden Verzeichnis vorhanden ist:

    if( _execl( cRun, cRun ) < 0 ) {
        MessageBox("Updater.exe is not in the main-program folder!", "Update error", MB_ICONINFORMATION);
    }
    


  • Problem ist gelöst. Bei der Formatierung eines CStrings für den Pfad im Programmablauf wurde ein \ zu viel eingefügt, was zu dem Fehler führte. Was nur komisch ist, dass es beim direkten Starten der Update.exe trotzdem funktionierte.


Anmelden zum Antworten