006
24.06.2005, 12:28 Uhr
~Marv
Gast
|
Probier mal das aus zur Ordnerauswahl. Ich hab das mal im Netz gefunden, kann aber nicht mehr sagen von wem! Also bei mir hat es geklappt....
Browseff.cpp
C++: |
#include "precomp.h" #include "browseff.h"
// Die HookProc wird benoetigt, um bei Bedarf // eine Vorauswahl treffen zu können. static int CALLBACK MyBrowseForFolderHook(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { switch(uMsg) { case BFFM_INITIALIZED: if(lpData) SendMessage(hWnd, BFFM_SETSELECTION, TRUE, lpData);
break; default: break; }
return(0); }
/* * * hWnd Owner - Entweder das OwnerWindow des Dialogs oder NULL * lpTitle - Ein zusaetzlicher Titel, der im Dialog angezeigt wird oder NULL * lpInitialFolder - Ordner, der vorselektiert werden soll oder NULL * lpFolder - In diesem Buffer wird der gewaehlte Ordner gespeichert * cchMax - Gibt an, wieviele character maximal in lpFolder gespeichert werden können. * Der Buffer sollte mindestens MAX_PATH character gross sein. Ist der Buffer * zu klein, wird der String abgeschnitten. * * Im Erfolgsfalle gibt die Funktion einen Wert != 0 zurück. In lpFolder ist der gewaehlte Ordner * gespeichert. Hat der User auf 'Abbrechen' gedrueckt, ist die Stringlaenge = 0. * * Im Fehlerfalle wird 0 zurueckgegeben. Ueber die API-Funktion GetLastError koennen weitere * Informationen ueber den Fehler abgerufen werden. * */ BOOL MyBrowseForFolder(HWND hWndOwner, LPCTSTR lpTitle, LPCTSTR lpInitialFolder, LPTSTR lpFolder, UINT_PTR cchMax) { ITEMIDLIST* pidl; BROWSEINFO bi; IMalloc* pMalloc = NULL; HRESULT hrIni, hr; TCHAR szName[MAX_PATH * 2];
if(!cchMax) { // Der Buffer muß mindestens einen character aufnehmen können SetLastError(ERROR_INVALID_PARAMETER); return(FALSE); }
if(IsBadWritePtr(lpFolder, (sizeof(*lpFolder) * cchMax))) { // Ein ungueltiger Zeiger wurde uebergeben SetLastError(ERROR_INVALID_PARAMETER); return(FALSE); }
hrIni = CoInitialize(NULL); // COM Laufzeitumgebung initialisieren
if(SUCCEEDED((hr = SHGetMalloc(&pMalloc)))) { bi.hwndOwner = hWndOwner; bi.pidlRoot = NULL; bi.pszDisplayName = szName; bi.lpszTitle = lpTitle; bi.ulFlags = BIF_USENEWUI | BIF_VALIDATE; bi.lpfn = MyBrowseForFolderHook; bi.lParam = (LPARAM)lpInitialFolder; bi.iImage = 0;
if(NULL == (pidl = SHBrowseForFolder(&bi))) { // Der User hat 'Abbrechen' gewaehlt hr = S_OK; lpFolder[0] = TEXT('\0'); } else { if(!SHGetPathFromIDList(pidl, szName)) { hr = HRESULT_FROM_WIN32(GetLastError()); } else { _tcsncpy(lpFolder, szName, cchMax); lpFolder[cchMax - 1] = TEXT('\0'); }
pMalloc->Free(pidl); } pMalloc->Release(); }
if(SUCCEEDED(hrIni)) CoUninitialize();
SetLastError(hr);
return(SUCCEEDED(hr)); }
|
Browseff.h
C++: |
#ifndef BROWSEFF_H #define BROWSEFF_H
BOOL MyBrowseForFolder(HWND hWndOwner, LPCTSTR lpTitle, LPCTSTR lpInitialFolder, LPTSTR lpFolder, UINT_PTR cchMax);
#endif
|
precomp.h
C++: |
#ifndef PRECOMP_H #define PRECOMP_H
#include <windows.h> #include <tchar.h> #include <shlobj.h>
#endif
|
|