Verwenden von Bibliotheken in Ihrem Programm
In diesem Thema werden einige der Punkte beschrieben, die bei der Verwendung von Bibliotheken in Ihrem Programm zu berücksichtigen sind.
In diesem Thema:
- Übersicht über die Bibliotheksprogrammierung
- Programmieren mit Bibliotheken
- Verwenden eines allgemeinen Dateidialogfelds mit Bibliotheken
- Aktivieren der Bibliotheksauswahl über die Benutzeroberfläche
- Zugreifen auf Bibliotheksinhalte in einem Programm
- Speichern von Benutzerinhalten in einer Bibliothek
- Supporting drag-and-drop operations in a library
- Synchronisierung mit einer Bibliothek
- Zugehörige Themen
Übersicht über die Bibliotheksprogrammierung
Bibliotheken ermöglichen es Benutzern, ihre dateibasierten Inhalte so zu organisieren, dass sie für sie von Bedeutung sind und nicht durch die Organisation des Dateisystems beschränkt werden. Wenn Ihr Programm Bibliotheken unterstützt, ermöglicht es dem Benutzer, seine Inhalte auf eine Weise zu finden, die für ihn sinnvoll ist, während er eine Benutzeroberfläche darstellt, die mit der Windows 7-Benutzeroberfläche konsistent ist. Bibliotheken erleichtern es Ihrem Programm auch, dateibasierte Inhalte zu finden, die in verschiedenen Ordnern oder auf verschiedenen Computern gespeichert sind.
In den Themen in diesem Abschnitt wird beschrieben, wie Sie Ihrem Programm Bibliotheksunterstützung hinzufügen und die neuen Funktionen nutzen können, die Bibliotheken bieten. Windows 7 bietet standardmäßig einen Teil dieser Unterstützung. Wenn das Programm die allgemeinen Dateidialogfelder, die es derzeit verwendet, nicht ändert, ist möglicherweise nur sehr wenig zusätzliche Programmierung erforderlich, um Bibliotheken zu unterstützen.
In diesem Abschnitt werden einige der wichtigsten Features beschrieben, die Bibliotheken bereitstellen, und wie Sie sie in Ihrem Programm unterstützen. Mit diesen Informationen können Sie entscheiden, welche Features die beste Benutzererfahrung in Ihrem Programm bieten. Wenn Ihr Programm die Dialogfelder für allgemeine Dateien anpasst, können Sie anhand der Informationen in diesem Abschnitt bestimmen, wie Sie die neuen Dialogfelder für allgemeine Dateien verwenden, um Bibliotheken zu verwenden, und entsprechende Funktionen in Windows 7 bereitstellen.
Programmieren mit Bibliotheken
Das Windows Shell-Programmiermodell beschreibt, wie ein Programm mit Windows Shell-Programmierobjekten interagiert. Während Dateisystemobjekte, z. B. Dateien und Verzeichnisse, durch Windows Shell-Objekte dargestellt werden, werden nicht alle Windows Shell-Objekte durch das Dateisystem dargestellt. Bibliotheken sind beispielsweise Windows Shell-Objekte, die keine Dateisystementsprechung aufweisen. Die Verwendung von Windows Shell-Objekten in Ihrem Programm ermöglicht dem Programm den Zugriff auf alle Shellobjekte und nicht nur auf Dateisystemobjekte.
Um die besten Ergebnisse zu erzielen, verwendet Ihr Programm die Shellbibliotheks-API, um mit Bibliotheken zu interagieren und auf deren Inhalte zuzugreifen. Obwohl Bibliotheken Dateisystemelemente wie Ordner und Dateien enthalten, sind Bibliotheken keine Dateisystemelemente. Daher können Dateisystem-APIs nicht für den Zugriff auf Bibliotheksfunktionen oder Bibliotheksinhalte verwendet werden.
Wenn Sie über ein vorhandenes Programm verfügen, das derzeit viele Dateisystem-APIs verwendet, kann Ihr Programm weiterhin Bibliotheksfunktionen nutzen. Die Shellbibliothek-API kann Dateisystemverweise auf die Elemente bereitstellen, die sich in einer Bibliothek befinden, und diese Dateisystemverweise, z. B. Dateiname und Pfad, können an die vorhandenen Dateisystem-APIs in Ihrem vorhandenen Programm übergeben werden.
Verschieben von bekannten Ordnern zu Bibliotheken
Vor Windows 7 war es üblich, einen bekannten Ordner wie den ordner Eigene Dokumente als Standardordner in Dateispeicher- oder Dateiöffnungsvorgängen zu verwenden. In Windows 7 sollte die entsprechende Bibliothek verwendet werden, damit der Benutzer in Ihrem Programm die gleiche Erfahrung wie andere Windows 7 Programme hat, z. B. den Windows-Explorer.
Wenn Sie derzeit die Windows Shell-API in Ihrem Programm verwenden, ist das Hinzufügen von Bibliotheksunterstützung unkompliziert. Wenn Sie z. B. derzeit die SHGetKnownFolderItem-Funktion aufrufen, um den Speicherort des ordners Eigene Dokumente abzurufen, können Sie den KNOWNFOLDERID-Wert des Eigene Dokumente bekannten Ordners durch den KNOWNFOLDERID-Wert der entsprechenden Bibliothek ersetzen.
Die folgende Tabelle zeigt die Beziehung zwischen den KNOWNFOLDERID-Werten bekannter Ordner und dem KNOWNFOLDERID-Wert der entsprechenden Bibliothek in Windows 7.
| Known Folder KNOWNFOLDERID-Werte | KNOWNFOLDERID-Werte der Bibliothek |
|---|---|
| _FOLDERID-Dokumente | FOLDERID _ DocumentsLibrary |
| FOLDERID _ Pictures | FOLDERID _ PicturesLibrary |
| FOLDERID _ Musik | FOLDERID _ MusicLibrary |
| FOLDERID _ RecordedTV | FOLDERID _ RecordedTVLibrary |
HomeGroup und freigegebene Bibliotheken
Wenn Sie Ihrem Programm Bibliotheksunterstützung hinzufügen, wird die Unterstützung für freigegebene Bibliotheken in einer HomeGroup aktiviert. Die HomeGroup wird durch ihren KNOWNFOLDERID-Wert FOLDERID _ HomeGroupidentifiziert. Ihr Programm kann den privaten oder freigegebenen Standardspeicherort des Benutzers ermitteln, indem der DEFAULTSAVEFOLDERTYPE-Wert im Aufruf der IShellLibrary::GetDefaultSaveFolder-Methode festgelegt wird.
Verwenden eines allgemeinen Dateidialogfelds mit Bibliotheken
Verwenden eines allgemeinen Dateidialogfelds mit Bibliotheken Das Dialogfeld "Allgemeine Datei" wurde aktualisiert, um Bibliotheken in Windows 7 zu unterstützen. Die folgende Abbildung zeigt, wie das Dialogfeld "Allgemeine Datei" für einen Benutzer in Windows 7 angezeigt wird.

Wenn ihr Programm in Windows 7 derzeit ein allgemeines Dateidialogfeld anzeigt und die Dialogfeldvorlage nicht ändert oder keines der zugehörigen Ereignisse einnimmt, wird die neue version Windows 7 des Dialogfelds automatisch angezeigt. Insbesondere müssen im Aufruf der allgemeinen Dateidialogfeldfunktion die Member lpfnHook, hInstance, lpTemplatename der OPENFILENAME-Struktur NULL sein, und die Flags OFN _ ENABLEHOOK und OFN _ ENABLETEMPLATE müssen eindeutig sein.
In Windows 7 ersetzen die IFileDialog-bezogenenSchnittstellen die allgemeinen Dateidialogfeldfunktionen, die in früheren Versionen von Windows verwendet wurden. Die früheren allgemeinen Dateidialogfeldfunktionen werden weiterhin in Windows 7 unterstützt, bieten jedoch nicht die vollständige benutzererfahrung Windows 7 und unterstützen keine Bibliotheken. Einige der neuen Features, die von den IFileDialog-bezogenen Schnittstellen unterstützt werden, sind:
- Der Benutzer kann auf die dateieigenschaften zugreifen, die vom Windows 7 Windows Explorer unterstützt werden, um die Dateien zu suchen und auszuwählen.
- Das Programm kann Schnittstellen und Methoden aus der Shell-Namespace-API verwenden, um mit den Elementen zu arbeiten.
- Das Programm kann ein datengesteuertes Anpassungsmodell anstelle eines ressourcendateigesteuerten Anpassungsmodells verwenden, um den allgemeinen Dateidialogfeldern neue Steuerelemente hinzuzufügen.
Sie sollten die IFileDialog-bezogenenSchnittstellen verwenden, wenn:
- Sie müssen das Allgemeine Dateidialogfeld für Ihr Programm in Windows 7 anpassen. Dadurch kann Ihr Programm mit Bibliotheken arbeiten und das Anpassen des Dialogfelds unterstützen.
- Sie möchten, dass der Benutzer mehrere Dateien aus einem allgemeinen Dateidialogfeld auswählen kann. Dadurch wird sichergestellt, dass Sie die richtigen Pfade zum ausgewählten Objekt erhalten, da eine Bibliothek Inhalte enthalten kann, die in verschiedenen Ordnern gespeichert sind.
Weitere Informationen zu den IFileDialog-bezogenenSchnittstellen finden Sie unter:
- IFileDialog
- IFileOpenDialog
- IFileSaveDialog
- IFileDialogCustomize
- IFileDialogEvents
- IFileDialogControlEvents
Aktivieren der Bibliotheksauswahl über die Benutzeroberfläche
Wenn ihr Programm es dem Benutzer ermöglicht, in Windows 7 einen Ordner auszuwählen, z. B. für Import- oder Exportfunktionen, sollte es dem Benutzer auch die Auswahl einer Bibliothek ermöglichen. Die IFileOpenDialog-Schnittstelle und die SHBrowseForFolder-Funktion ermöglichen es dem Benutzer, eine Bibliothek auszuwählen, wenn er zur Auswahl eines Ordners aufgefordert wird. Die IFileOpenDialog-Schnittstelle wird der SHBrowseForFolder-Funktion vorgezogen, da IFileOpenDialog die Windows 7-Benutzeroberfläche unterstützt.
Damit Benutzer Ordner auswählen können, wenn sie die IFileOpenDialog-Schnittstelle verwenden, rufen Sie SetOptions auf, wobei das FOS _ PICKFOLDERS-Flag festgelegt ist, und stellen Sie sicher, dass das FLAG FOS _ FORCEFILESYSTEM gelöscht ist.
FILEOPENDIALOGOPTIONS fileOptions;
hr = fileOpenDialogBox->GetOptions(&fileOptions);
fileOptions = fileOptions | FOS_PICKFOLDERS | ~FOS_FORCEFILESYSTEM;
hr = fileOpenDialogBox->SetOptions(fileOptions);
Damit Benutzer Ordner beim Aufrufen der SHBrowseForFolder-Funktion auswählen können, legen Sie im ulFlags-Member der BROWSEINFO-Struktur das BIF _ USENEWUI-Flag fest, und deaktivieren Sie das BIF _ RETURNONLYFSDIRS-Flag.
BROWSEINFO browseInfo;
browseInfo.ulFlags = BIF_USENEWUI | ~BIF_RETURNONLYFSDIRS;
// Set other member values
pidl = SHBrowseForFolder(&browseInfo);
Zugreifen auf Bibliotheksinhalte in einem Programm
Um auf den Inhalt einer Bibliothek zuzugreifen, müssen Sie die Windows Shell-API verwenden. Funktionen der Dateisystem-API können nicht für den Zugriff auf Bibliotheksinhalte verwendet werden, da Bibliotheken keine Dateisystemobjekte sind. Wenn Ihr Programm einen benutzerdefinierten Dateibrowser verwendet, der auf der Dateisystem-API basiert, kann es keine Bibliotheken durchsuchen oder auf Bibliotheksinhalte zugreifen.
In diesem Abschnitt wird beschrieben, wie Sie auf Bibliotheksinhalte zugreifen können, sodass Sie die beste Möglichkeit zum Aktualisieren Ihres Programms auswählen können, um mit Bibliotheken zu arbeiten.
Zugreifen auf Bibliotheksinhalte mit der IShellLibrary-Schnittstelle
Die einfachste Möglichkeit für ein Programm, auf Bibliotheksinhalte zuzugreifen, ist die Verwendung der Shellbibliotheks-API. Wenn Sie an einem Programm arbeiten, das die Dateisystem-API verwendet, kann die Shellbibliotheks-API die Dateisystemordner einer Bibliothek zurückgeben, wodurch die Änderung am vorhandenen Programmcode minimiert wird.
IShellLibrary *picturesLibrary;
hr = SHLoadLibraryFromKnownFolder(FOLDERID_PicturesLibrary,
STGM_READ,
IID_PPV_ARGS(&picturesLibrary));
// picturesLibrary now points to the user's picture library
IShellItemArray *pictureFolders;
hr = pslLibrary->GetFolders(LFF_FORCEFILESYSTEM, IID_PPV_ARGS(&pictureFolders));
// pictureFolders now contains an array of Shell items that
// represent the folders found in the user's pictures library
Zugreifen auf Bibliotheksinhalte mit den Shell-APIs
Da die Bibliotheksobjekte Teil des Shell-Programmiermodells sind, können sie mit anderen shell Windows-APIs verwendet werden. Beispielsweise können Sie die IShellItem- und IShellFolder-Schnittstellen in Ihrem Programm zusammen mit verwandten Hilfsfunktionen verwenden, um auf die gleiche Weise auf den Inhalt einer Bibliothek zu zugreifen, wie Sie Ordner und Ordnerinhalte aufzählen würden, um mit den Dateisystem-APIs auf Inhalte zu zugreifen.
Die Windows Shell-APIs unterstützen zwei Enumerationsmodi für den Zugriff auf den Inhalt einer Bibliothek:
Durchsuchen der Enumeration
Die Enumeration "Durchsuchen" ist der Standardenumerationsmodus und enumeriert den Inhalt eines Bibliotheksordners. Löschen Sie das _ ENUM-Flag SHCONTF _ NAVIGATION, um diesen Modus zu verwenden.
Navigationsenumeration
Die Navigationsenumeration enumeriert die Bibliotheksordner. Legen Sie das _ ENUM-Flag SHCONTF NAVIGATION _ auf die Verwendung dieses Modus fest.
Wenn ihr Programm ein benutzerdefiniertes Struktursteuerfeld verwendet, um in den Ordnern des Benutzers zu navigieren, erhalten Sie durch Auflisten der Ordner im Navigationsenumerationsmodus eine Liste der Ordner einer Bibliothek, die mit der Aufzählung von Ordnern in Windows Explorer in Windows 7 konsistent ist.
Beispiele für die Verwendung dieser Features in einem Programm finden Sie im ShellStorage-Beispiel im Windows SDK.
Speichern von Benutzerinhalten in einer Bibliothek
Ihr Programm kann Benutzerinhalte in einer Bibliothek sowie in einem Ordner in der Bibliothek speichern. Ebenso kann der Benutzer in einem bestimmten Ordner in einer Bibliothek speichern oder einfach in der Bibliothek speichern.
Jede Bibliothek verfügt über einen Ordner, der als Standardspeicherort festgelegt ist. Der Standardspeicherort wird definiert, wenn die Bibliothek erstellt wird. Der Benutzer kann den Standardspeicherort jedoch einem beliebigen Ordner in der Bibliothek zuweisen. Obwohl der Benutzer keinen Standardspeicherort konfigurieren muss, hat er die Möglichkeit, ihn zu ändern. Wenn der Benutzer den Ordner löscht, der derzeit als Standardspeicherort festgelegt ist, konfiguriert die Bibliothek automatisch den nächsten Ordner in der Bibliothek als Standardspeicherort.
Es gibt mehrere Möglichkeiten, Benutzerinhalte in einer Bibliothek zu speichern.
Shell-API
Wenn Sie das Shell-Programmiermodell verwenden und ein Shellelement, wie durch ein IShellItem,IStorage oder IStream dargestellt, in einem Bibliotheksobjekt speichern, wird das Shell-Element automatisch am Standardspeicherort der Bibliothek gespeichert.
Dateisystem-API
Wenn Sie über ein vorhandenes Programm verfügen, das viele Dateisystem-API-Aufrufe verwendet, können Sie einen Pfad zu dem Ordner abrufen, der als Standardspeicherort der Bibliothek definiert ist. Der Ordnerpfad kann dann an eine Dateisystem-API übergeben werden.
Beispiele für die Verwendung dieser Features in einem Programm finden Sie im ShellStorage-Beispiel im Windows SDK.
Unterstützen von Drag & Drop-Vorgängen in einer Bibliothek
Wenn Ihr Programm Drag & Drop-Aktionen unterstützt, sollten diese aktualisiert werden, um die richtige Bibliotheksinteraktion zu unterstützen. Wenn eine Datei in einer Bibliothek gelöscht wird, sollte die gelöschte Datei am Standardspeicherort gespeichert werden. Wenn ein Ordner in einer Bibliothek abgelegt wird, sollte der gelöschte Ordner der Bibliothek als neuer Ordner hinzugefügt werden. Wenn eine Datei in einem vorhandenen Ordner abgelegt wird, der nicht der Standardspeicherort ist, sollte die Datei dem ausgewählten Ordner hinzugefügt werden.
Beispiele zum Hinzufügen von Bibliotheksunterstützung für die Drag & Drop-Funktionalität Ihrer Programme finden Sie im ShellLibraryCommandLine-Beispiel im Windows SDK.
Synchronisieren mit einer Bibliothek
In diesem Thema wird beschrieben, wie ein Programm seine Ansicht des Bibliotheksinhalts auf dem neuesten Stand halten kann.
Massenaktualisierung
Da der Benutzer die Ordner einer Bibliothek interaktiv ändern kann, wenn das Programm nicht ausgeführt wird, sollte das Programm SHResolveLibrary aufrufen, wenn es beginnt, Änderungen an der Bibliothek zu finden und zu speichern. Die Shell-API stellt die SHResolveLibrary-Funktion bereit, damit ein Programm den aktuellen Inhalt einer Bibliothek und die aktuellen Speicherorte aller Ordner abrufen kann, die die Bibliothek enthalten könnte.
Beachten Sie, dass SHResolveLibrary eine blockierende Funktion ist, deren Rückgabe je nachdem, was sich in der Bibliothek geändert hat, sehr lange dauern kann. Daher sollte sie nicht über einen UI-Thread aufgerufen werden.
Nachdem das Programm auf den neuesten Stand gebracht wurde, kann es sich dann für Änderungsbenachrichtigungen registrieren, um eine aktuelle Ansicht zu verwalten.
Shell-API-Benachrichtigung
Die Windows Shell-API stellt die SHChangeNotifyRegister-Funktion bereit. Dies ist die bevorzugte Methode für Nicht-Dienstprozesse, um über eine Änderung in der Bibliothek benachrichtigt zu werden.
Um Änderungen an Elementen in einer Bibliothek mithilfe der Windows Shell-API zu erkennen, rufen Sie SHChangeNotifyRegister auf, um Ihr Programm für Benachrichtigungen über Änderungen an Elementen in einem Bibliotheksordner zu registrieren. Diese Funktion kann Ihr Programm benachrichtigen, wenn es eine Änderung in einer Bibliothek oder nur in einer bestimmten Bibliothek gibt. Benachrichtigungen werden sofort gesendet, wenn eine Bibliothek geändert wird.
Dateisystem-API-Benachrichtigung
Dateisystembenachrichtigungen müssen in Dienstprozessen verwendet werden.
Um Änderungen an Elementen in einer Bibliothek mithilfe der Dateisystem-API zu erkennen, aufzählen Sie die Ordner in der Bibliothek, und rufen Sie FindFirstChangeNotification für jeden zu überwachenden Ordner auf. Ihr Programm erhält eine Benachrichtigung, wenn sich ein überwachter Ordner ändert. Rufen Sie ReadDirectoryChangesWauf, um die dateispezifische Datei zu finden, die sich im Ordner geändert hat. Um Änderungen in der Bibliotheksbeschreibungsdatei zu erkennen, überwachen Sie den Ordner, in dem sie enthalten ist. Die Bibliotheksbeschreibungsdatei befindet sich im Ordner FOLDERID _ Libraries. Die Beschreibungsdatei der Bibliothek sollte jedoch nicht geöffnet oder geändert werden.