Pfad der .exe herausfinden



  • Geht das eventuell mit argv[0] und dem aktuellen Working-Directory?


  • Mod

    wxSkip schrieb:

    Geht das eventuell mit argv[0] und dem aktuellen Working-Directory?

    Über argv kann man leider auch unnütze Informationen bekommen: Wird das Programm über eine Verknüpfung oder einen alias gestartet, so bekommt man in der Regel dessen Namen übergeben, was einem in diesem Fall nicht wirklich weiterhilft.



  • Das wird schon funktioniert haben, nur interpretiert deine cout-Implementation wohl wchar_t* nicht als String. Probier's mit char und GetModuleFileNameA.



  • Oder wcout ?



  • Oder wcout?

    sicherlich nicht... cout bezweckt ja was völlig anderes....

    Das wird schon funktioniert haben, nur interpretiert deine cout-Implementation wohl wchar_t* nicht als String. Probier's mit char und GetModuleFileNameA.

    genau das wars....

    aber: wieso kann das cout nicht ausgeben? welche grundlagen hab ich hier nicht gelesen? 😉

    bzw. was bewirkt das "A" hinter der Funktion? .. (ich weiß ich sollte das in büchern nachlesen.. aber wenn jmd zeit hat kann er mir das sehr gerne sagen... (abgesehen von der kaffeekasse, wo finde ich die hier? 😉 )

    EDIT: abgesehen davon taucht dann noch eine frage auf... wie kann ich den dateinamen am ende abschneiden? (bei strings wäre das ja kein problem.. die funktionen sind hier soooo was von schön einfach ( wie bei php :- )) )



  • Das A hinter den Funktionsnamen bedeutet, dass diese Funktion nur mit dem ASCII-Zeichensatz arbeitet. Parallel dazu gibt es noch eine Version mit einem W, was dann für Wide-Characters steht.

    Zu dem Ausgabeproblem: Eventuell funktioniert das mit printf besser:

    printf("%s",aPath);
    

    MfG, Jochen.



  • Jochen S. schrieb:

    Das A hinter den Funktionsnamen bedeutet, dass diese Funktion nur mit dem ASCII-Zeichensatz arbeitet. Parallel dazu gibt es noch eine Version mit einem W, was dann für Wide-Characters steht.

    Genau. Aber am besten allgmein bleiben (weder A noch W hinschreiben) und dann das ganze über die Projekteinstellungen regeln. (dann auch gleich für Text das T Makro verwenden).



  • http://msdn.microsoft.com/en-us/library/ms683197(VS.85).aspx

    (size_t) NameLen = GetModulFileName( [in] HANDLE, [out] PVOID, [in] size_t );



  • taurus schrieb:

    Das wird schon funktioniert haben, nur interpretiert deine cout-Implementation wohl wchar_t* nicht als String. Probier's mit char und GetModuleFileNameA.

    genau das wars....

    aber: wieso kann das cout nicht ausgeben? welche grundlagen hab ich hier nicht gelesen? 😉

    Es gibt nunmal keinen überladenen operator<< für wchar_t*. Die Lösung ist (aber offenbar MS-Spezifisch) wcout.



  • ipsec schrieb:

    ...aber offenbar MS-Spezifisch...

    Falls das auf wcout bezogen ist, dann kann man beruhigend sagen, dass wcout c++ Standard ist.



  • War ich auch immer der Meinung, aber auf http://www.cplusplus.com/reference/ konnte ichs nicht finden. Vllt bin ich auch zu blöd^^



  • Gut, aber was Standard ist bestimmt nicht diese Seite, sondern das mächtige Standardkomitee, dessen Errungenschaften in einem Dokument festgehalten sind.

    http://www.open-std.org/jtc1/sc22/wg21/

    Und da findest du nun mal unter § 27.3.2 das Thema "Wide stream objects" und im Absatz 2 und 3 die Beschreibung des Objects wcout. Damit ist es Standard.



  • Gut, überzeugt 🙂
    Ich hatte blos immer besagte Seite für standardkonform gehalten.



  • Die Seite ist zwar nicht schlecht, aber bei gewissen Dingen liegt sie einfach falsch. Zum Beispiel haben sie es bei std::pow() immer noch nicht fertiggebracht, alle Überladungen aufzulisten, obwohl ich vor fast einem Jahr die "Spotted an error? contact us"-Funktion auf cplusplus.com benutzt habe. 🙄



  • "Überladung" ... mhh am Montag werde ich mir wohl aus der Bücherei ein schickes Buch ausleihen.. Grundlagen eben 😉

    Genau. Aber am besten allgmein bleiben (weder A noch W hinschreiben) und dann das ganze über die Projekteinstellungen regeln. (dann auch gleich für Text das T Makro verwenden).

    was meinst du mit "für text das t makro verwenden" und vorallem.. welche projekteinstellung? nennt sich das zeichensatz? (benutze qt und suche gerade diese einstellung.. finde sie aber nicht 😉



  • T-Makro:

    T("Hello World")
    

    Ist wahrscheinlich für String-Literale, wird also entweder zu

    "Hello World"  //const char*
    

    oder

    L"Hello World"  //const wchar_t*
    


  • also möglichkeit a)

    Es funktioniert ja auch ohne Unicode! Nur mußt Du dann - wie mein Vorposter schon erwähnt hat - Dein Projekt so compilieren, daß es kein Unicode benutzt.

    oder alternativ

    TEXT u. TCHAR (statt char) machen Dich bzw. Deine Datentypen allerdings unabhängig davon, ob Du mit oder ohne Unicode compilierst.

    das heißt T("ein text") würde ich bei ausgaben verwenden
    cout << T("ein text") << endl; EDIT: wie müsste ich hier das T als TEXT definieren?

    und anstatt char verwende ich dann ab sofort nur noch tchar, richtig?

    heißt also mein projekt wird gerade in unicode kompiliert? (ja wo seh ich das denn hier 🙂 )



  • taurus schrieb:

    EDIT: wie müsste ich hier das T als TEXT definieren?

    Ist T nicht schon definiert?

    So müssten die Defines für T() und TCHAR ungefähr aussehen:

    #define T(x) L##x
    typedef wchar_t TCHAR;
    
    /*Und das wäre für ASCII-Zeichensatz:*/
    #define T(x) x
    typedef char TCHAR;
    


  • Heisst das Makro nicht "_T"? "T" wäre ziemlich übel, da das wohl der meistgenutzte Bezeichner für Templateparameter ist. Was nicht heisst, das "_T" gut wäre.



  • Nexus schrieb:

    Heisst das Makro nicht "_T"? "T" wäre ziemlich übel, da das wohl der meistgenutzte Bezeichner für Templateparameter ist. Was nicht heisst, das "_T" gut wäre.

    Auch mir ist nur die _T Variante bekannt. 🤡


Anmelden zum Antworten