SHBrowseForFolder , BROWSEINFO



  • Hi !

    Wenn ich mit SHBrowseForFolder ein Verzeichnis auswähle, bekomme ich nicht den ganzen Pfad zurück, sondern nur das letzte verzeichnis.

    Mit folgendem Code:

    char folder[MAX_PATH] = "";
    
    BROWSEINFO BI;
    BI.hwndOwner = hwnd;
    BI.pidlRoot = NULL;
    BI.pszDisplayName = folder;
    BI.lpszTitle = "Choose folder";
    BI.ulFlags = NULL;
    BI.lpfn = NULL;
    
    SHBrowseForFolder(&BI);
    

    erhalte ich z.B. statt "c:\ordner1\ordner2" nur "ordner2" in folder zurück.

    Was muss ich ändern, um den ganzenPfad zu erhalten??

    MfG
    Jochen



  • LPITEMIDLIST pidl;
    TCHAR        szPath[MAX_PATH * 2];
    
      pidl = SHBrowseForFolder(&BI);
      SHGetPathFromIDList(pidl, szPath);
    

    In Deinem Code sehe ich übrigens nirgendwo die Freigabe des zurückgelieferten Pointers. Das darfst Du nicht vergessen!



  • Danke.

    Was meinst du mit "die Freigabe des zurückgelieferten Pointers. " ??



  • Ich meinte das z.B. so:

    if(pidl)
    {
      IMalloc* pMalloc = NULL;
    
        if(SUCCEEDED(SHGetMalloc(&pMalloc)))
        {
            pMalloc->Free((PVOID)pidl);  //pidl freigeben
            pMalloc->Release();
        }
    }
    


  • war großer quatsch was hier stand.

    [ Dieser Beitrag wurde am 29.01.2002 um 13:11 Uhr von GuybrushThreepwood editiert. ]



  • Hi !

    Das klappt ja alles so weit ganz gut.
    Aber eine Frage hätte ich noch dazu:

    Wenn der Standarddialog zum Auswählen des Ordners geöffnet wird, würd ich gerne automatisch in ein bestimmtes Verzeichnis springen.

    In der Struktur BROWSEINFO habe ich folgenden Parameter gefunden:
    pidlRoot
    Pointer to an ITEMIDLIST structure (PIDL) specifying the location of the root folder from which to browse. Only the specified folder and its subfolders appear in the dialog box. This member can be NULL; in that case, the namespace root (the desktop folder) is used.

    Aber mit dieser ITEMIDLIST kann ich rigendwie nix anfangen.
    Wie bekomme ich da den Pfad rein, den ich als "rrot folder" will?

    Gruß Jochen



  • Dazu mußt Du die CALLBACK-Funktion verwenden. Wenn diese dann die Nachricht BFFM_INITIALIZED erhält, kannst Du den Ornder per BFFM_SETSELECTION ändern. Die Beschreibung der Messages findest Du in der Beschreibung zur CallBack Funktion.



  • schau mal unter IShellFolder::ParseDisplayName

    Translates a file object's or folder's display name into an item identifier list.

    wenn du nicht weiterkommst meld dich wieder.
    btw: das was -King- gepostet hat brauchst du nur, wenn du einen ordner vorselektieren willst (aber nicht zum root machen).

    ach ja bevor du fragst, wenn du probleme mit dem unicode string hast -> MultiByteToWideChar

    The MultiByteToWideChar function maps a character string to a wide-character (Unicode) string. The character string mapped by this function is not necessarily from a multibyte character set. images/smiles/icon_smile.gif

    [ Dieser Beitrag wurde am 31.01.2002 um 18:18 Uhr von kwoTx editiert. ]



  • Original erstellt von kwoTx:
    **btw: das was -King- gepostet hat brauchst du nur, wenn du einen ordner vorselektieren willst (aber nicht zum root machen).
    **

    Genau das will er doch auch:

    Wenn der Standarddialog zum Auswählen des Ordners geöffnet wird, würd ich gerne automatisch in ein bestimmtes Verzeichnis springen.

    Oder versteh ich da was falsch?



  • also ich hab das hier gelesen: Wie bekomme ich da den Pfad rein, den ich als "rrot folder" will? (was immer rrot heisst images/smiles/icon_wink.gif)

    is ja auch egal, jetzt weiss er zu beidem etwas, egal was er machen wollte ...



  • @kwoTx: ich hab mal deinen Ansatz ausprobiert, aber ich bekomms nicht hin. Folgender Code führt zu einer Win-Schutzverletzung:

    BROWSEINFO BI;
     BI.hwndOwner = hwnd;
     BI.pidlRoot = NULL;
     BI.pszDisplayName = folder;
     BI.lpszTitle = "Choose folder";
     BI.ulFlags = NULL;
     BI.lpfn = NULL;
    
     LPITEMIDLIST pidl;
     static TCHAR        szPath[MAX_PATH * 2] = "";
    
     WCHAR root[MAX_PATH]; 
     MultiByteToWideChar(CP_THREAD_ACP,MB_USEGLYPHCHARS,"c:\\files\\N.dat",-1,root,MAX_PATH);
    
     IShellFolder *psf = NULL;
     psf->ParseDisplayName(hwnd,NULL,root,NULL,&pidl,NULL);
    
     BI.pidlRoot = pidl;
     pidl = SHBrowseForFolder(&BI);
     SHGetPathFromIDList(pidl, szPath);
    

    Bei der Zeile
    psf->ParseDisplayName(hwnd,NULL,root,NULL,&pidl,NULL);
    stürzt das Prog ab. Wo liegt denn der Fehler?

    Gruß Jochen



  • Original erstellt von GuybrushThreepwood:
    **```cpp
    IShellFolder *psf = NULL;
    psf->ParseDisplayName(hwnd,NULL,root,NULL,&pidl,NULL);

    Du rufst die Methode über eine NULL-Pointer auf! Du mußt Dir doch erst einmal einen gültigen Pointer besorgen. Verwende hierfür SHGetDesktopFolder().

    [ Dieser Beitrag wurde am 04.02.2002 um 12:45 Uhr von -King- editiert. ]

    [ Dieser Beitrag wurde am 04.02.2002 um 12:46 Uhr von -King- editiert. ]

    [ Dieser Beitrag wurde am 04.02.2002 um 12:47 Uhr von -King- editiert. ]



  • @ King: Danke, jetzt ist die Schutzverletzung weg.

    Aber es geht immer noch nicht!
    Wenn ich mit SHBrowseForFolder() den Standarddialog aufrufe, wird der Ordner "c:\files\" immer noch nicht angezeigt!
    Sollte doch aber jetzt gehen, oder?

    BROWSEINFO BI;
     BI.hwndOwner = hwnd;
     BI.pidlRoot = NULL;
     BI.pszDisplayName = folder;
     BI.lpszTitle = "Choose folder";
     BI.ulFlags = NULL;
     BI.lpfn = NULL;
    
     LPITEMIDLIST pidl;
     static TCHAR        szPath[MAX_PATH * 2] = "";
    
     WCHAR root[MAX_PATH]; 
     MultiByteToWideChar(CP_THREAD_ACP,MB_USEGLYPHCHARS,"c:\\files\\N.dat",-1,root,MAX_PATH);
    
     IShellFolder *psf = NULL;
     SHGetDesktopFolder(&psf);
     psf->ParseDisplayName(hwnd,NULL,root,NULL,&pidl,NULL);
    
     BI.pidlRoot = pidl;
    
     pidl = SHBrowseForFolder(&BI);
     SHGetPathFromIDList(pidl, szPath);
    

    MfG
    Jochen



  • so auf den ersten blick: MultiByteToWideChar(CP_THREAD_ACP,MB_USEGLYPHCHARS,"c:\\files\\N.dat",-1,root,MAX_PATH);

    du willst c:\files\ als root haben... warum dann N.dat mit angeben?
    existiert die datei, wird sie selbst als root dargestellt; macht uU sogar noch sinn bei archiven. wenn nicht -> standardroot

    ach und nicht vergessen das IShellFolder interface zu releasen.



  • Danke, werd ich versuchen.

    ach und nicht vergessen das IShellFolder interface zu releasen.

    Was soll ich machen? Ich versteh kein Wort davon.

    Gruß Jochen



  • Hi !

    MultiByteToWideChar (CP_THREAD_ACP,MB_USEGLYPHCHARS,"c:\\files",-1,root,MAX_PATH);

    und

    MultiByteToWideChar(CP_THREAD_ACP,MB_USEGLYPHCHARS,"c:\\files\",-1,root,MAX_PATH);

    funktionieren auch nicht! Nach wie vor ist der "Arbeitsplatz" mein root und nicht das angegebene Verzeichnis.

    Mir fällt jetzt wirklich nix mehr ein. Hat noch jemand ne Idee? images/smiles/icon_confused.gif

    Gruß Jochen



  • wenn de willst schicks mal her, dann schau ichs mir ma an: kwoTx@gmx.de
    (dumme frage: der ordner c:\files existiert, oder?)


Anmelden zum Antworten