Datei - akt. Dateipfad des programms auslesen...



  • Hi all

    Wie komme ich an den aktuellen pfad meines programms ran? Ich weiss dass auch dieses thema schon öfter gestellt wurde, aber die Suchfunktion funktioniert irgendwie net.
    Ich hab echt keine ahnung wie ich den programmpfad rausfinde. ein bisschen beispielcode wär net schlecht.

    Danke

    Striker



  • char buf[256];
    GetModuleFileName(NULL, buf, 255);
    CString strPfad;
    strPfad.Format("%s", buf);
    int nTmp = strPfad.ReverseFind('\\');
    strPfad.Delete(nTmp,strPfad.GetLength()-nTmp);
    

    ich verschiebs gleich mal in die FAQ.

    alternative Lösung von thomas80d:

    CString strPath = CString( GetModuleFileName()).Mid( 1, CString(GetModuleFileName()).ReverseFind('\\')-1);
    

    und kommentiert:

    CString strPath = GetModuleFileName();// Pfad + Name der Exe holen
    int pos = strPath.ReverseFind( '\\'); // letztes '\' finden
    strPath = strPath.Mid(1, pos-1); // Name der Exe abtrennen, so dass nur noch der Pfad übrig bleibt
    


  • Dieser FAQ Beitrag gehört eindeutig zu denen der schlechteren Kategorie!
    Der strotzt nur so von Fehlern.
    Hier wird eine Funktion GetModuleFileName() verwendet die einen CString zurückgibt und die ist nicht gezeigt und in der MFC gibt es die nicht.

    1. GetModuleFileName liefert einen liefert einen DWORD zurück.
    2. Weil dies ein DWORD ist kanst Du keinen . operator (Punkt-operator) darauf anwenden.
    3. Weil es keinen Punkt.operator bei einem DWORD gibt, kann es auch kein Mid geben, genauswenig wei einen ReverseFind.
    4. Macht es keinen Sinn eine Funktion zweimal aufzurufen wenn Du beim zweiten mal nichts anderes angibst als beim ersten mal.
    5. Wird in C/C++ relativ zu 0 gezählt. CString::Mid(1,...) würde also das erste Zeichen abschneiden. (auch ein Fehler in diesem FAQ Beitrag)

    Hier drei korrekte Varianten (allerdings nicht getestet und einfach so frei hingeschrieben). Variante 1 würde ich bevorzugen.
    Variante 1 kommt aus http://www.mpdvc.de/html.htm#Q13 (BTW: DiesenFAQ Beitrag habe ich vor gefühlten 20 Jahren geschrieben).

    CString GetApplicationDirectory()
    {
       TCHAR szPathName[_MAX_PATH];
       ::GetModuleFileName(NULL, szPathName, _MAX_PATH);
       LPTSTR pszFileName = _tcsrchr(szPathName, '\\') + 1;
       *pszFileName = '\0'; 
       return szPathName;
    }
    
    CString GetApplicationDirectory()
    {
       CString strPath;
       ::GetModuleFileName(NULL, CStrBuf(strPath,_MAX_PATH), _MAX_PATH);
       strPath.GetBufferSetLength(strPath.ReverseFind('\\')-1);
       return szPath;
    }
    
    CString GetApplicationDirectory()
    {
       CString strPath;
       ::GetModuleFileName(NULL, CStrBuf(strPath,_MAX_PATH), _MAX_PATH);
       return strPath.Mid(0,(strPath.ReverseFind('\\')-1);
    }
    

Log in to reply