Programmpfad ermitteln?



  • Hi,

    ich muss (dank GetPrivateProfileString) den absoluten Programmpfad ermitteln. Aber hier erstmal der Code des Problemes.

    #include <iostream>
    #include <windows.h>
    
    int main (void)
    {
        char buffer[128];
    
        GetPrivateProfileString ("test", "value", "nogo", buffer, 128, "f:\\test2\\test.ini");
    
        std::cout << buffer << std::endl;
    
        std::cin.get();
        return 0;
    }
    

    Wie man sehen kann muss ich bei GetPrivateProfileString als letzten Parameter den Absoluten Pfad angeben, der Relative funktioniert hier (leider) nicht. Um den Absoluten Pfad zu bestimmten benötige ich erst den Pfad woher das Programm aufgerufen wurde.

    Wie kann ich den Ermitteln? Mir wäre zwar eine portable Lösung (ohne boost) lieber, aber hier muss wohl auch die WinAPI herhalten. Hat jemand eine Idee?



  • Hallo,

    du kannst es mit "GetModuleFileName()" ermitteln 😉



  • hmn da ist aber noch der programmname drin, wie kann ich den rauslöschen? vorallem wenn ich nicht weiß wie die *.exe heißt, falls der User die exe umbenannt hat?



  • Hi [...],
    durchsuche einfach den String rückwärts nach einem Backslash. Der erste Backslash den du findest, ist der Trenner zwischen Pfad und Dateiname. Wenn du keinen Bachslash findest, ist ein Pfad vorhanden.



  • Herrmann schrieb:

    Hi [...],
    durchsuche einfach den String rückwärts nach einem Backslash. Der erste Backslash den du findest, ist der Trenner zwischen Pfad und Dateiname. Wenn du keinen Bachslash findest, ist ein Pfad vorhanden.

    Wie macht man sowas? 😕



  • TCHAR appPath[MAX_PATH];
    
    GetModuleFileName(NULL,appPath,MAX_PATH); // liefert z.B. "c:\blupp\hallo.exe"
    PathRemoveFileSpec(appPath); // jetzt ist nur noch "c:\blupp" übrig
    
    MessageBox(NULL,appPath,"blupp",MB_OK);
    


  • dafür muss man aber die shlwapi.h und shlwapi.lib inkludieren, das wollte ich eigentlich nicht 😞



  • dann machs eben mit Strings oder willst du <string> auch nicht inkludieren 😉 ?

    char appPath[MAX_PATH];
    	::GetModuleFileName(NULL, appPath, MAX_PATH);
    	std::string Path(appPath);
    	Path = Path.substr(0, Path.rfind('\\'));
    

    oder so aehnlich.

    Gruss,
    DeSoVoDaMu



  • ich benutze C



  • Dann halt in C:

    char appPath[MAX_PATH];
    ::GetModuleFileName(NULL, appPath, MAX_PATH);
    char* appName = strrchr( appPath, "\\" );
    ++appName;
    

    oder so ähnlich. In appName müsste dann der Programmname stehen.

    Edit:
    Sorry, Du willst ja nur den Pfad, außerdem erwartet strrchr ein Integer 😕 als Parameter. So sollte es gehen:

    int ch = '\\';
    char appPath[MAX_PATH];
    ::GetModuleFileName(NULL, appPath, MAX_PATH);
    char* appName = strrchr( appPath, ch );
    *appName = 0;
    


  • so z.b.

    char programPath[MAX_PATH];
    GetModuleFileName(GetModuleHandle(NULL), programPath, sizeof(programPath));
    {
        char *str = strrchr(programPath, NULL, '\\');
        if (str2) *str = 0;
    }
    


  • Hmm, so ist sogar noch besser! 👍


Anmelden zum Antworten