SHBrowseForFolder , BROWSEINFO



  • 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