Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aby można było użyć obiektu przestrzeni nazw, należy go zidentyfikować. Oznacza to uzyskanie wskaźnika do listy identyfikatorów elementów (PIDL) lub, w przypadku obiektów systemu plików, jego ścieżki. W tej sekcji omówiono dwa prostsze sposoby uzyskiwania identyfikatorów obiektów.
W przypadku bardziej zaawansowanego podejścia, które będzie działać z dowolnym folderem, użyj interfejsu IShellFolder. Aby uzyskać więcej informacji, zobacz Uzyskiwanie informacji o zawartości folderu.
- okno dialogowe OpenFiles
- okno dialogowe SHBrowseForFolder
- foldery specjalne i CSIDLs
- Prosty przykład użycia CSIDLs i SHBrowseForFolder
Okno dialogowe OpenFiles
Aby umożliwić użytkownikowi nawigowanie po przestrzeni nazw i wybranie folderu, aplikacja może użyć interfejsuIFileDialog. Wywołanie tego interfejsu za pomocą flagi FOS_PICKFOLDERS powoduje uruchomienie zwykłego okna dialogowego Otwórz pliki w trybie wybierania folderów.
W przypadku systemu Windows Vista i nowszych jest to zalecany sposób wybierania folderów.
Okno dialogowe SHBrowseForFolder
Aby umożliwić użytkownikowi nawigowanie po przestrzeni nazw i wybranie folderu, aplikacja może po prostu wywołać SHBrowseForFolder. Wywołanie tej funkcji uruchamia okno dialogowe z interfejsem użytkownika, które działa w sposób zbliżony do typowych okien dialogowych Otwórz lub ZapiszAs.
Gdy użytkownik wybierze folder, SHBrowseForFolder zwraca w pełni kwalifikowaną nazwę PIDL folderu i jego nazwę wyświetlaną. Jeśli folder znajduje się w systemie plików, aplikacja może przekonwertować kod PIDL na ścieżkę, wywołując SHGetPathFromIDList. Aplikacja może również ograniczyć zakres folderów, z których użytkownik może wybrać, określając folder główny. Wyświetlą się jedynie foldery znajdujące się pod tym katalogiem głównym w przestrzeni nazw. Poniższa ilustracja przedstawia okno dialogowe SHBrowseForFolder z folderem głównym ustawionym na Program Files.
Prosty przykład użycia SHBrowseForFolder zostanie udostępniony później.
Foldery specjalne i CSIDLs
Wiele często używanych folderów jest oznaczonych jako specjalne przez system. Te foldery mają dobrze zdefiniowany cel, a większość z nich znajduje się we wszystkich systemach. Nawet jeśli nie są one obecne początkowo, ich nazwy i lokalizacje są nadal zdefiniowane, więc można je dodać później. Kolekcja folderów specjalnych obejmuje wszystkie standardowe foldery wirtualne systemu, takie jak Drukarki, Moje dokumenty i Sąsiedztwo sieci. Zawiera również wiele standardowych folderów systemu plików, takich jak Program Files i System.
Mimo że foldery są standardowym składnikiem wszystkich systemów, ich nazwy i lokalizacje w przestrzeni nazw mogą się różnić. Na przykład katalog System to C:\Winnt\System32 w niektórych systemach i C:\Windows\System32 w innych. W przeszłości zmienne środowiskowe udostępniały sposób określania nazwy i lokalizacji folderu specjalnego w dowolnym systemie. Powłoka zapewnia teraz bardziej niezawodny i elastyczny sposób identyfikowania folderów specjalnych, CSIDLs. Zazwyczaj należy ich używać zamiast zmiennych środowiskowych.
CsIDLs zapewniają jednolity sposób identyfikowania i lokalizowania folderów specjalnych, niezależnie od ich nazwy lub lokalizacji w określonym systemie. W przeciwieństwie do zmiennych środowiskowych, csIDLs mogą być używane z folderami wirtualnymi, a także folderami systemu plików. Każdy folder specjalny ma przypisany unikatowy identyfikator CSIDL. Na przykład folder systemu plików Program Files ma CSIDL CSIDL_PROGRAM_FILES, a wirtualny folder Otoczenie sieciowe ma CSIDL CSIDL_NETWORK.
Plik CSIDL jest używany w połączeniu z jedną z kilku funkcji powłoki w celu pobrania pliku PIDL folderu specjalnego lub ścieżki specjalnego folderu systemu plików. Jeśli folder nie istnieje w systemie, aplikacja może wymusić jego utworzenie, łącząc jego CSIDL z CSIDL_FLAG_CREATE. Plik CSIDL można przekazać do następujących funkcji:
- SHGetFolderLocation, który uzyskuje PIDL folderu specjalnego.
- SHGetFolderPath, który pobiera ścieżkę specjalnego folderu systemu plików.
Należy pamiętać, że te dwie funkcje zostały wprowadzone w wersji 5.0 Shell i zastępują funkcje SHGetSpecialFolderLocation i SHGetSpecialFolderPath.
Przykład jak używać CSIDLs i SHBrowseForFolder
Poniższa przykładowa funkcja, PidlBrowse, ilustruje, jak używać CSIDLs do pobierania PIDL folderu oraz jak używać SHBrowseForFolder, aby użytkownik mógł wybrać folder. Zwraca on nazwę PIDL i nazwę wyświetlaną wybranego folderu.
LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
{
LPITEMIDLIST pidlRoot = NULL;
LPITEMIDLIST pidlSelected = NULL;
BROWSEINFO bi = {0};
if(nCSIDL)
{
SHGetFolderLocation(hwnd, nCSIDL, NULL, NULL, &pidlRoot);
}
else
{
pidlRoot = NULL;
}
bi.hwndOwner = hwnd;
bi.pidlRoot = pidlRoot;
bi.pszDisplayName = pszDisplayName;
bi.lpszTitle = "Choose a folder";
bi.ulFlags = 0;
bi.lpfn = NULL;
bi.lParam = 0;
pidlSelected = SHBrowseForFolder(&bi);
if(pidlRoot)
{
CoTaskMemFree(pidlRoot);
}
return pidlSelected;
}
Aplikacja wywołująca przekazuje uchwyt okna, który jest wymagany przez SHBrowseForFolder. Parametr nCSIDL jest opcjonalnym plikiem CSIDL używanym do określania folderu głównego. Zostaną wyświetlone tylko foldery poniżej folderu głównego w hierarchii. Ilustracja pokazana wcześniej została wygenerowana przez wywołanie tej funkcji za pomocą nCSIDL ustawionej na CSIDL_PROGRAM_FILES. Aplikacja wywołująca przekazuje również bufor ciągu, pszDisplayName, w celu przechowywania nazwy wyświetlanej wybranego folderu, gdy funkcja PidlBrowse zwraca. Obowiązkiem aplikacji wywołującej jest zwalnianie listy IDList zwróconej przez SHBrowseForFolder przy użyciu CoTaskMemFree.