Programmordner



  • Hi Troll,

    danke, aber

    1. kennt CSIDL_PROGRAM_FILES mein Compiler nicht (Borland 5.02), und

    2. hab ich bei meiner Google - Recherche gelesen, das SHGetSpecialFolderPath nicht unter Win95 funzt (ich weiß, das hat quasi kein Mensch mehr, aber Vorgaben sind Vorgaben... 🙄 )

    Andere Ideen?



  • Empfohlen wird der Weg über SHGetFolderPath(). Diese Funktion sitzt ab Windows 2000 in Shell32.dll. Das ist kein Problem, wenn Du Dir den Funktions-Pointer über GetProcAddress() besorgst. Wenn Du die Funktion in dieser Dll nicht findest, kannst Du die Version aus shfolder.dll benutzen. Diese Dll ist auch als redistributable gekennzeichnet, sodaß Du diese Dll Deinem Project beilegen kannst. Damit läuft es dann auch unter 95.



  • @King:

    Danke, aha... 🙄 Öhmm... Könntest du das, wenn möglich, mit ein wenig Code erläutern? 😃 An diesem Punkt setzt es bei mir leider aus...



  • Das ist doch gar nicht schwer. Aber da ich heute einen guten Tag habe, habe ich Dir eben mal eine Funbktion geschrieben:

    #include <windows.h>
    #include <tchar.h>
    #include <shlobj.h>
    
    #define NUM_ELEMENTS(x) (sizeof((x)) / sizeof((x)[0]))
    
    LPCTSTR lpszShell32  = TEXT("shell32.dll");
    LPCTSTR lpszSHFolder = TEXT("shfolder.dll");
    
    #ifdef UNICODE
      LPCSTR lpszGFP = "SHGetFolderPathW";
    #else
      LPCSTR lpszGFP = "SHGetFolderPathA";
    #endif
    
    typedef HRESULT (WINAPI * SHGETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPTSTR);
    
    UINT_PTR GetProgramFilesFolder(LPTSTR lpFolder, UINT cchMax)
    {
      SHGETFOLDERPATH pfnGFP;
      HINSTANCE       hDll;
      UINT_PTR        cch  = 0;
      TCHAR           szFolder[MAX_PATH * 2];
    
        if(NULL != (hDll = LoadLibrary(lpszShell32)))
        {
            if(NULL != (pfnGFP = (SHGETFOLDERPATH)GetProcAddress(hDll, lpszGFP)))
            {
                if(SUCCEEDED(pfnGFP(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, szFolder)))
                {
                    _tcsncpy(lpFolder, szFolder, min(cchMax, NUM_ELEMENTS(szFolder)));
                    lpFolder[cchMax - 1] = TEXT('\0');
                    cch = _tcslen(lpFolder);
                }
            }
            FreeLibrary(hDll);
        }
    
        if(!cch)
        {
            if(NULL != (hDll = LoadLibrary(lpszSHFolder)))
            {
                if(NULL != (pfnGFP = (SHGETFOLDERPATH)GetProcAddress(hDll, lpszGFP)))
                {
                    if(SUCCEEDED(pfnGFP(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, szFolder)))
                    {
                        _tcsncpy(lpFolder, szFolder, min(cchMax, NUM_ELEMENTS(szFolder)));
                        lpFolder[cchMax - 1] = TEXT('\0');
                        cch = _tcslen(lpFolder);
                    }
                }
                FreeLibrary(hDll);
            }
        }
    
      return(cch);
    }
    

    Du mußt dann aber, damit es auf allen Plattformen funktioniert, die Datei 'shfolder.dll' mit Deinem Projekt rausgeben. Aber das habe ich ja oben schon gesagt.



  • Bist ein Schatz. 😃 Danke!



  • Anstatt den Umweg über Loadlibrary zu gehen kann man auch gleich den entsprechenden Registry-Eintrag auslesen mit:

    HANDLE hKey;
    DWORD Size;
    char Path[MAX_PATH];

    hKey = OpenRegKey (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0);

    RegQueryValueEx (hKey, "ProgramFilesDir", NULL, NULL, Path, &Size);

    CloseRegKey (hKey);



  • Ist das auch dokumentiert? Bleibt das auch bei zukünftigen Windows-Versionen so? Funktioniert das auf allen jetzigen Windows-Versionen?
    Einfache Antwort auf alle 3 Fragen: Nein.



  • Ich habe es bist jetzt unter Windows 95/98, NT 4.0 und Windows 2000 erfolgreich bei einer selbstentwickelten Setup-Prozedur benutzt. Außerdem wenn Du so argumentierst wer garantiert denn, das die DLL, die Du lädst in einer der nächsten Windows Versionen noch so heißt, oder existiert?

    [ Dieser Beitrag wurde am 10.08.2002 um 11:30 Uhr von Uli editiert. ]



  • Funktioniert das auf allen jetzigen Windows-Versionen?

    JA



  • Original erstellt von Uli:
    [QB]Ich habe es bist jetzt unter Windows 95/98, NT 4.0 und Windows 2000 erfolgreich bei einer selbstentwickelten Setup-Prozedur benutzt. Außerdem wenn Du so argumentierst wer garantiert denn, das die DLL, die Du lädst in einer der nächsten Windows Versionen noch so heißt, oder existiert?
    QB]

    Die dll sollte man auf jeden Fall dabeipacken, dann sollte es gehen.
    Auf die Registry würde ich mich auch nicht verlassen.
    Alleine um ein Programm "autozustarten" gibt es viele Möglichkeiten,
    die mal auf der und mal auf der anderen Windows-Version funktionieren..



  • JA

    Komisch. Bei mir heißt der Wert "ProgramFilesPath" und nicht "ProgramFilesDir". aber wenn Euch der Weg über die Registry lieber ist, dann lasst Euch nicht aufhalten ...



  • Original erstellt von -King-:
    [quote]JA

    **
    Komisch. Bei mir heißt der Wert "ProgramFilesPath" und nicht "ProgramFilesDir". aber wenn Euch der Weg über die Registry lieber ist, dann lasst Euch nicht aufhalten ...**[/QUOTE]
    Bei mir gibt's beide. 😉


Anmelden zum Antworten