Den reinen Dateinamen herausbekommen ?



  • Ich möchte gerne den reinen Dateinamen meiner laufenden executable herausbekommen.

    Habe es bereits mit GetModuleHandle versucht damit bekomme ich aber nur den gesamten Pfad.

    Gibt es eine sichere Methode den aktuell laufenden Executable Name und auch wirklich nur den Name herauszubekommen ?

    Wo ich schonmal dabei bin gibt es eine Funktion zum einfachen umbennenen während der Laufzeit ? Sofern das überhaupt möglich ist. Wird wohl ein script erledigen müssen.



  • musste dir aus dem pfad rausschneiden



  • Ist ja auch gut und schön, nur wenn jemand den Dateinamen ändert wird es lustig mit dem "schneiden". Deswegen schrieb ich ja "sicher"



  • char* GetExeName (char* path);
    {
    char exe_name[100];
    int istrlen=0;
    int i=0;
    
    istrlen = strlen(path);
    while (path[istrlen] != '\\')
    {
             exe_name[i] = path[istrlen];
             i++;
             istrlen--;
    }
    .
    .
    .
    return exe_name;
    
    }
    

    jetzt musst du nur noch exe_name wieder umdrehen, denn da steht der name jetzt falschrum drin... aber das kriegst du bestimmt noch selber hin oder? 😉



  • dateien kann man soweit ich weiß nicht während der laufzeit umbennen!



  • Hallo.

    Meiner Funktion übergibst du den String den dir GetFileName() liefert. Also den gesamten Pfad. Er schneidet dir den Dateinamen mit Endung raus.

    TCHAR* ClipFileName(TCHAR* Path)
    {
    for(unsigned short int i=lstrlen(Path);i>=0;i--)
    	{
    	if(Path[i]=='\\')
    		{
    		TCHAR filename[255];	
    		ZeroMemory(filename,255);
    		lstrcpy(filename,&Path[i+1]);
    		lstrcpy(Path,filename);
    		return Path;
    		}
    	}
    return NULL;
    }
    

    Mit freundlichem Gruß.



  • Oder Du nimmst PathStripPath()

    Voraussetzungen:
    Minimum DLL Version: shlwapi.dll version 4.71 or later
    Custom Implementation: No
    Header: shlwapi.h
    Import library: shlwapi.lib
    Minimum operating systems: Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0
    Unicode: Implemented as ANSI and Unicode versions.



  • @Hepi so gehts natürlich auch 😃



  • Die von mir gepostete Lösung tut dasselbe und ist unabhängig von DLLs und Co.
    Problem war schon gelöst.



  • wärs nicht weitaus einfacher mit der string funktion "find_last_of("/")" und danach mit "substr(...")



  • wenn man c++ benutzt auf jeden fall 👍 👍 👍



  • Tolga schrieb:

    Die von mir gepostete Lösung tut dasselbe und ist unabhängig von DLLs und Co.
    Problem war schon gelöst.

    Mit 15 Zeilen Quelltext gegenüber 1 Zeile bei meiner Lösung.

    Achtest Du bei Deiner DLL-Unabhängigkeit auch darauf, das Deine Programme auf Windows 3.11 noch laufen? Das einzige, was benötigt wird, ist ein installierter Internet Explodierer ab Version 4. Nenn mir ein 32-bit Windows-Betriebssystem außer Windows 95, das ohne einen IE 4 daherkommt.

    Mit Verlaub, aber ich fand die 15 Zeilen etwas umständlich, zumal es eine WinAPI-Funktion dafür gibt, die das mit einer Zeile löst...



  • Danke das mit dem Pfad abziehen hatte ich nicht bedacht. Sind nicht alle möglichkeiten Win kompatibel ab 95 ? sehe da ncihts fremdes zu nt 😉



  • @Hepi: 😉

    Vorsicht Hepi! Von deiner Lösung wissen wir alle nicht wie lang sie ist. Der Aufruf meiner Funktion nimmt auch nur eine Zeile 😉

    Während meine Funktion unabhängig vom Betriebssystem ist, benötigt deine NT.
    Was aber wenn der Softwarenutzer Win98 hat. (solche solls ja geben!)
    Außerdem erfordert das Einbinden der DLL viel mehr Aufrufe und Code. ⚠

    Ansonsten ist dein Vorschlag alles in allem in Ordnung. Wenn man weis dass das Programm NUR auf NT laufen soll, dann kann man ruhig die von dir zitierte API Funktion benutzen. 👍

    PS: Wer slässt sich schon von 15 Zeilen C-Code abschrecken?
    Ein 0815 Programm hat viele viele Tausend Zeilen Code. 🕶

    Mit freundlichem Gruß.



  • Zu deiner Verteidigung:

    Wenn man IE hat gehts ja noch. Auch wenn unelegant.



  • Tolga schrieb:

    Während meine Funktion unabhängig vom Betriebssystem ist, benötigt deine NT.

    Lerne lesen!

    Tolga schrieb:

    Was aber wenn der Softwarenutzer Win98 hat. (solche solls ja geben!)

    Lerne lesen!

    Tolga schrieb:

    Wenn man weis dass das Programm NUR auf NT laufen soll, dann kann man ruhig die von dir zitierte API Funktion benutzen.

    Lerne lesen!

    Ich zitiere mich mal selbst aus diesem Thread (bzw. die MSDN):

    Minimum operating systems: Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0

    Man braucht den IE 4 nur, wenn man Windows NT 4.0 oder Windows 95 hat!
    Ansonsten funktioniert dieser Funktionsaufruf bei allen Windows Betriebssystemen ohne weitere Zutaten.

    Und da braucht auch nichts verteidigt werden... Deine Leseschwäche vielleicht...





  • Hepi schrieb:

    Mit 15 Zeilen Quelltext gegenüber 1 Zeile bei meiner Lösung.

    Willst du ernsthaft sagen deine Lösung sei kürzer? Du weist gar nicht wie lang deine Lösung ist, denn MS-Programmierer haben die Codes deiner Lösung getippt nicht du.
    Was ist mit dem nötigen Code um die DLL einzubinden????
    Hast du je im Leben ne DLL eingebunden?

    Das ganze erfordert weit mehr Programmieraufwand und auch mehr Rechenaufwand für das Programm als du dir vorzustellen scheinst.

    MfG.



  • Tolga schrieb:

    Willst du ernsthaft sagen deine Lösung sei kürzer? Du weist gar nicht wie lang deine Lösung ist, denn MS-Programmierer haben die Codes deiner Lösung getippt nicht du.
    Was ist mit dem nötigen Code um die DLL einzubinden????
    Hast du je im Leben ne DLL eingebunden?

    Das ganze erfordert weit mehr Programmieraufwand und auch mehr Rechenaufwand für das Programm als du dir vorzustellen scheinst.

    MfG.

    Du hast 15 Zeilen präsentiert (ebenso voller unbekannter Funktionsaufrufe, zumindest was deren Größe und Aufwand angeht). Ich 1 (in Worten: eine)! Es ist scheißegal, wieviele Zeilen Code Jungs von Microsoft gehackt haben: Kennst Du die Zeilenlänge von lstrlen? Von ZeroMemory (bzw. von RtlZeroMemory(Destination,Length) oder gar memset((Destination),0,(Length)), sind ja eh alles nur Makros auf memset)? Von lstrcpy? Du rufst in Deiner Funktion dort 3 Funktionen auf, ich eine... siehst Du nicht den geringeren Aufwand bei meiner Lösung? Wobei ich ja nichtmal darauf rumreiten würde, wenn Du nicht deine "ich habe gepostet, thread muß zu, es braucht keine weitere Lösung mehr" Attitüde rausgeholt hättest. Das war unnötig!

    Der nötige Code, um die DLL einzubinden, gestaltet sich für den Programmierer wie folgt:

    #include <shlwapi.h>
    
    #pragma comment(lib, "shlwapi.lib") //bei Verwendung des Visual Studios
    

    Immer noch kürzer als Dein 15 Zeilen Code.
    Ich kann Dir allerdings versichern, das ich schon DLLs in Programme eingebunden habe, als Du noch nichtmal in der Lage warst, einen Computer einzuschalten.

    Ich kenne den Programmieraufwand, und genau deshalb präsentiere ich dem Fragesteller lieber eine Funktion mit einer einzigen Zeile anstatt mir erst mühsam eine halbgewalkte Lösung auszudenken und sie dann mit seinen 15 Zeilen Code zu präsentieren (das ist dann nämlich noch mehr Aufwand für den Programmierer, alleine schon die Tipparbeit). Willst Du ernsthaft behaupten, das Lösung ausdenken, 15 Zeilen schreiben, testen usw. weniger Aufwand ist als 1 WinAPI-Funktionsaufruf einzutippen?

    Und, um auf Deine Frage zurückzukommen:

    Wer slässt sich schon von 15 Zeilen C-Code abschrecken?

    Jemand, der jedweden (eigenen) Aufwand scheut und regelmäßig (man könnte sagen: Tag für Tag auf beruflicher Basis) Code unter Zeitdruck mit Deadlines zu präsentieren hat.

    Und weniger Rechenaufwand sehe ich bei Deiner Lösung auch keinen.



  • @Tolga,
    Deine Lösung ist zudem noch falsch:

    TCHAR filename[255];    
            ZeroMemory(filename,255);
    

    Statt 255 sollte da MAX_PATH stehen.

    Auszug aus der WINDEF.H:

    #define MAX_PATH          260
    

    Blackbird
    PS: Und was passiert mit *Path beim Aufrufer, wenn ein Fehler auftritt? Was passiert mit den return codes?


Anmelden zum Antworten