GetModuleFileName und MID



  • Hi,
    ich versuche mit GetModuleFileName das Verzeichnis/Speicherort des Programms zu finden.
    Allerdings erhalte ich für MID einen Fehler.

    #include <windows.h>
    #include <iostream>
    
    std::wstring installdir_;
    
    TCHAR szPath[MAX_PATH];
    installdir_ = GetModuleFileName(NULL, szPath, MAX_PATH).Mid( 1, GetModuleFileName(NULL, szPath, MAX_PATH).ReverseFind('\\')-1);
    
    Error
    C2228: Links von ".Mid" muss sich eine Klasse/Struktur/Union befinden.
    Typ ist DWORD
    

    Vielen Dank im voraus,
    Gruß
    lucio



  • Schau Dir mal an, was der Rückgabewert von GetModuleFileName ist (auf diesen versuchst Du ja Mid anzuwenden, was natürlich nicht geht)
    http://msdn.microsoft.com/en-us/library/ms683197%28VS.85%29.aspx
    Und mach mal aus der einen Zeile 3-4 Zeilen, dann wirds vielleicht klarer.



  • Hi,
    ich hatte mich an das Besispiel aus diesem Forum gehalten, s. 3 Code-Beispiel.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39131.html

    Das scheint dann so nicht verwendbar zu sein.

    Gruß
    lucio


  • Mod

    Der Code aus dem Beispiel sind absolut korrekt. Deine Interpretation ist absoluter Unfug.

    Wie wäre es wenn Du Dich zuerst mal mit C++ algemein auseinandersetzt, oder insbesondere mit der Beschreibung der Funktionen, die Du verwendest?



  • Was nimmst Du das denn so persönlich.

    Wenn ich alles wüsste, würde ich hier nicht posten.

    Oder ist das Wording "absoluter Unfug"
    die Arroganz des BesserWissers?


  • Mod

    lucio77 schrieb:

    Was nimmst Du das denn so persönlich.

    Wenn ich alles wüsste, würde ich hier nicht posten.

    Oder ist das Wording "absoluter Unfug"
    die Arroganz des BesserWissers?

    1. Nehme ich das nicht persönlich.
    2. Finde ich es absolut unsinnig den Code in der FAQ als nicht funktionierend anzunehmen, wenn Du mit Deinem Code unter Beweis stellst, dass Du kaum keinen Schimmer von C/C++ hast.
    3. Habe ich Dir auch einen Rat gegen, der mir sinnvoll erscheint.
    4. Ja! Ich weiß es besser!



  • Ich verdiene meinen Lebensunterhalt seit 20 Jahren IT
    und bin ein Umsteiger von anderen Programmiersprachen.

    Manchmal wünsche ich mir ein Forum, wo ich für einen
    Monats- oder Jahresbeitrag Fragen stellen kann und
    Anworten ohne pubertäres Gelaber erhalte. Einfach so.

    Vielleicht hat jemand einen Tip.

    /lucio


  • Mod

    lucio77 schrieb:

    Ich verdiene meinen Lebensunterhalt seit 20 Jahren IT
    und bin ein Umsteiger von anderen Programmiersprachen.

    Auch 20 Jahre Erfahrung schützen nicht davor Fragen zu stellen, die man sich und anderen ersparen kann.
    BTW: Deine 20 Jahre überbiete ich locker. 😉

    Vielleicht hat jemand einen Tip.

    Dieser FAQ Beitrag gehört eindeutig zu denen der schlechteren Kategorie!
    Der strotzt nur so von Fehlern.
    Insofern muss ich Dir das natürlich zu gute halten, weil ich auf den auch nur einen kurzen Blick geworfen habe.
    Insofern: Sorry! Meine Ausage, dass dieser FAQ Artikel korrekt ist war falsch!

    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 liefer 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);
    }
    

    PS: Das Du mich als pubertär bezeichnest nehme ich mal als Kompliment bzgl. meines Alters.



  • Wenn doch alles Diskussionen zu solch einem fruchtbaren Ergebnis führen würden :-).

    Gruß Kimmi



  • Uff!

    Und danke!

    Ich werde mich weiter bilden und
    in Eurer Bücherecke stöbern. Meine
    momentane Literatur ist zu seicht.

    Grüße
    lucio


  • Mod

    BTW: Ich habe meine Antwort an den FAQ Artikel leicht modifiziert angehängt.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39131.html


Anmelden zum Antworten