Pfad vorbelegen in SHGetSpecialFolderLocation
-
Ich habe da ein kleines Problem mit SHGetSpecialFolderLocation.
Dort möchte ich eigentlich gern einen manuellen Pfad, bzw.
den zuletzt gewählten einsetzen als Standardwert.Muss ich auf SHGetSpecialFolderLocation verzichten und etwas
anderes verwenden? Aus der MSDN werde ich in dem Punkt nicht
ganz schlau. Soweit ich gelesen habe kann ich ausschließlich
die fest definierten Ordner aus Windows ansteuern.Wählt der User nun in c:\xyz\abc aus, dann hätte ich das aber schon ganz gern
als vorbelegten Pfad fürs nächste Aufrufen des Dateidialoges.Hier der Buttonaufruf in meiner MFC-Dialog-Anwendung:
CString m_csLocation=""; BROWSEINFO bi; ZeroMemory(&bi, sizeof(BROWSEINFO)); TCHAR szDiplayName[MAX_PATH]; ZeroMemory(szDiplayName, MAX_PATH); LPITEMIDLIST lpStartFolder = NULL; SHGetSpecialFolderLocation(GetSafeHwnd(), 0, &lpStartFolder); //je nachdem welche csidl man angibt wird der entsprechende pfad vorbelegt! bi.hwndOwner = GetSafeHwnd(); bi.pszDisplayName = szDiplayName; bi.lpszTitle = _T("Ordner wählen:"); bi.ulFlags = BIF_USENEWUI|BIF_NEWDIALOGSTYLE; bi.pidlRoot = lpStartFolder; LPITEMIDLIST pIDList = SHBrowseForFolder(&bi); LPMALLOC pMalloc = NULL; SHGetMalloc(&pMalloc); if(pIDList != NULL){ SHGetPathFromIDList(pIDList, m_csLocation.GetBuffer(MAX_PATH)); m_csLocation.ReleaseBuffer(); pMalloc->Free(pIDList); } pMalloc->Free(lpStartFolder); pMalloc->Release();
-
Habe mir eben nochmal SHGetFolderLocation. Scheint ja, alsob man da nur
Systempfade mit ansteuern kann
-
Das geht ganz einfach nicht und is auch winapi!
-
-
Danke Martin!!
Was ich noch nicht verstehe ist, wie ich den Pfad nun aus der letzten
Auswahl wieder als "Standard" beim nächsten Aufruf des Suchendialoges
setzen kann.In meinem Versuch wird noch immer nur der Standard gewählt.
BROWSEINFO bi; TCHAR szDisplayName[MAX_PATH]; LPITEMIDLIST pidl; LPMALLOC pMalloc = NULL; ZeroMemory(&bi, sizeof(bi)); bi.hwndOwner = NULL; //nun versuche ich einen CString dem lParam zuzuweisen //e.g. c:\\test bi.lParam = (LPARAM)(&pfadx); bi.lpfn = BrowseCallbackProc; bi.pszDisplayName = szDisplayName; bi.lpszTitle = TEXT("Select folder"); bi.ulFlags = BIF_VALIDATE|BIF_RETURNONLYFSDIRS|BIF_USENEWUI|BIF_NEWDIALOGSTYLE; pidl = SHBrowseForFolder(&bi); if ( pidl != 0 ) { // get the name of the folder TCHAR path[MAX_PATH]; if ( SHGetPathFromIDList ( pidl, path ) ) { MessageBox(path); //CString pfadx soll wert von Auswahl annehmen und beim //nächsten Aufruf dann als Vorbelegung in den lParam fliessen. pfadx=path; } // free memory used IMalloc * imalloc = 0; if ( SUCCEEDED( SHGetMalloc ( &imalloc )) ) { imalloc->Free ( pidl ); imalloc->Release ( ); } }
-
Verstehe Dein Problem nicht. Das kurze Beispiel von Nish zeigt doch wie Du einen bestimmten Pfad vorgeben kannst über die Callback Funktion.
Du musst halt den Wert vorgeben, den Du haben möchtest.
-
Hallo Martin,
den Pfad kann ich in der Callback ja angeben, aber wenn er aus der letzten
erfolgreichen Auswahl des "Öffnen"-Dialoges generiert werden soll, dann
müsste ich ja der Callback sagen:Nimm aus CString path den Wert als Vorbelegung für deinen Aufruf
mit LPARAM. Nur ist ja mein CString in der Callback nicht bekannt
oder gültig.int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData) { // Look for BFFM_INITIALIZED if(uMsg == BFFM_INITIALIZED) { SendMessage(hwnd, BFFM_SETSELECTION, TRUE,(LPARAM)_T("c:\\")); //lParam statisch; /* TRUE,(LPARAM)(&path)); //lParam aus CString generieren, was nicht geht...; */ } return 0; }
-
Dann must Du eine entsprechende globale Variable nehmen, damnit es so ist!