Schreiben einer Windows XP-Anwendung, die Benutzer- und Anwendungsdaten unter dem korrekten Pfad speichert

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 310294 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D310294
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
310294 HOW TO: Write a Windows XP Application That Stores User and Application Data in the Correct Location
Hinweis: Die Verwendung der hier aufgeführten Informationen sowie Makro- oder Programmcodes geschieht auf Ihre eigene Verantwortung. Microsoft stellt Ihnen diese Informationen sowie Makro- und Programmlistings ohne Gewähr auf Richtigkeit, Vollständigkeit und/oder Funktionalität sowie ohne Anspruch auf Support zur Verfügung. Die zur Verfügung gestellten Makro- und Programmierungsbeispiele sollen lediglich exemplarisch die Funktionsweise des Beispiels aufzeigen.

Weitere Informationen zu den von Microsoft angebotenen Supportoptionen finden Sie unter folgender Internetadresse:
http://support.microsoft.com/
Wichtig: Dieser Artikel enthält Informationen zum Bearbeiten der Registrierung. Bevor Sie die Registrierung bearbeiten, vergewissern Sie sich bitte, dass Sie die Registrierung wiederherstellen können, falls ein Problem auftritt. Weitere Informationen zum Erstellen einer Sicherungskopie, zum Wiederherstellen und Bearbeiten der Registrierung finden Sie in folgendem Artikel der Microsoft Knowledge Base:
256986 Beschreibung der Microsoft Windows-Registrierung
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Anwendungen arbeiten mit zwei Arten von Dokumenten, den vom Benutzer erstellten und den von der Anwendung erstellten Dokumenten. Um gültige Ordnerpfade für die Speicherung von Benutzer- und Anwendungsdaten abzurufen, sollten Ihre Anwendungen die SHGetFolderPath-Shellfunktion verwenden. Dies ist wichtig, wenn Windows XP-Anwendungen die Verwendung desselben Computers durch mehrere Benutzer und die schnelle Umschaltung von Benutzern unterstützen sollen.

Dieser Artikel beschreibt in den folgenden Schritten, wie Sie Benutzerdaten unter dem korrekten Pfad speichern:
  • Erstellen einer Win32-Anwendung.
  • Hinzufügen einer Option Speichern unter zum Menü Datei.
  • Verwenden des Standard-Dialogfelds Datei speichern für Verweis auf Standardpfad.
  • Überprüfen des korrekten Pfads für Datei speichern.
  • Erinnern der vorherigen Benutzerauswahl.
  • Überprüfen der vorherigen Benutzerauswahl.
Dieser Artikel beschreibt außerdem in den folgenden Schritten, wo Anwendungsdaten gespeichert werden müssen und wie Sie sicherstellen, dass sie in den korrekten Verzeichnissen gespeichert werden:
  • Klassifizieren von Anwendungsdaten.
  • Speichern von Anwendungsdaten unter dem korrekten Pfad.
  • Umsichtiges Verwenden der Registrierung.

Voraussetzungen

Im folgenden werden die empfohlene Hardware, Software, Netzwerkinfrastruktur, Fähigkeiten, Kenntnisse und Service Packs beschrieben, die Sie benötigen:
  • Windows XP Home Edition oder Windows XP Professional
  • Microsoft Visual Studio .NET oder Visual Studio 6.0
  • Vorkenntnisse zur Win32-Anwendungsentwicklung

Erstellen einer Win32-Anwendung

Starten Sie Visual Studio und erstellen Sie eine neue Win32-Anwendung mit dem Namen SavingData.
  • Wählen Sie in Visual C++ 6.0 aus der Liste der verfügbaren Projekttypen Win32-Anwendung und anschließend im Setup-Assistenten für Anwendungen die Option für eine typische "Hello World"--Anwendung aus.
  • Klicken Sie in Visual Studio .NET unter Projekttypen auf Visual C++-Projekte und anschließend unter Vorlagen auf Win32-Projekt. Akzeptieren Sie die vom Application Setup Wizard angezeigten Standard-Anwendungseinstellungen.

Hinzufügen einer Option Speichern unter zum Menü Datei

  1. Klicken Sie auf Ressourcenansicht und doppelklicken Sie anschließend auf IDC_SAVINGDATA.
  2. Fügen Sie eine Menüoption Speichern unter zum Menü Datei hinzu. Verwenden Sie IDM_FILE_SAVEAS als ID des Menüelements.
  3. Suchen Sie die WndProc-Fensterprozedur der Anwendung in SavingData.cppm und fügen Sie eine neue case-Anweisung zum Abschnitt WM_COMMAND hinzu, um die Menüoption Speichern unter zu verarbeiten. Rufen Sie die OnFileSaveAs-Funktion auf, die Sie im nächsten Abschnitt erstellen werden. Diese Funktion benötigt keine Parameter.

    Ihr Code sollte folgendermaßen aussehen:
    case WM_COMMAND:
       wmId    = LOWORD(wParam); 
       wmEvent = HIWORD(wParam); 
       // Parse the menu selections.
       switch (wmId)
       {
       case IDM_ABOUT:
          DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
          break;
       case IDM_EXIT:
          DestroyWindow(hWnd);
          break;
       case IDM_FILE_SAVEAS:
          OnFileSaveAs();
          break;
       default:
          return DefWindowProc(hWnd, message, wParam, lParam);
       }
       break;

Verwenden des Standard-Dialogfelds Datei speichern für Verweis auf Standardpfad.

Wenn ein Benutzer das Dialogfeld Datei speichern (oder Datei öffnen) das erste Mal anzeigt, muss das Dialogfeld standardmäßig auf den Ordner Eigene Dateien des Benutzers (oder einen abhängigen Ordner wie Eigene Bilder für Bilddateien oder Eigene Musik für Audiodateien) verweisen.

Hinweis: Sie dürfen nie einen Pfad in Ihrer Anwendung hart codieren, weil der physische Pfad nie garantiert werden kann. Beispielsweise könnte ein Administrator den Ordner Eigene Dateien auf einen Netzwerkstandort verschieben.
  1. Fügen Sie am Anfang von SavingData.cpp die folgenden include-Anweisungen hinzu:
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
  2. Fügen Sie den folgenden Prototyp für die OnFileSaveAs-Funktion hinzu:
    void OnFileSaveAs();
  3. Erstellen Sie die neue OnFileSaveAs-Funktion. Verwenden Sie in dieser Funktion die SHGetFolderPath-Funktion zusammen mit dem CSIDL_MYPICTURESCSIDL-Bezeichner, um den korrekten Ordnerpfad für die Speicherung von Bilddaten abzurufen. Übergeben Sie diesen Ordnerpfad an die GetSaveFileName-Funktion, um das Standard-Dialogfeld Datei speichern anzuzeigen.

    Ihr Code sollte folgendermaßen aussehen:
    void OnFileSaveAs()
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
    
    // Initialize OPENFILENAME structure.
    ZeroMemory( &openFile, sizeof(OPENFILENAME) );
    openFile.lStructSize = sizeof(OPENFILENAME);
    // Default to My Pictures. First, get its path.
    if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_MYPICTURES, 
                                          NULL, 0, szPath ) ) )
    {
       // Set lpstrInitialDir to the path that SHGetFolderPath obtains. 
       // This causes GetSaveFileName to point to the My Pictures folder.
          openFile.lpstrInitialDir = szPath;
    }
    // Display the standard File Save dialog box, defaulting to My Pictures.
    if ( GetSaveFileName( &openFile ) == TRUE )
    {
          // User clicks the Save button.
       // Save the file
    }
    else
    {
       // User cancels the File Save dialog box.
    }
    }

Überprüfen des korrekten Pfads für Datei speichern

  1. Drücken Sie die Taste [F5], um das Projekt zu erstellen.
  2. Führen Sie die Anwendung aus und klicken Sie im Menü Datei auf Speichern unter.
  3. Überprüfen Sie, ob das Standard-Dialogfeld Datei speichern standardmäßig auf den Ordner Eigene Bilder verweist, wie durch CSIDL_MYPICTURES angegeben.
  4. Klicken Sie auf Abbrechen, um das Dialogfeld zu schließen, und schließen Sie die Anwendung.

Erinnern der vorherigen Benutzerauswahl

Bei der nachfolgenden Verwendung des Dialogfelds Datei speichern (oder Datei öffnen) sollte das Dialogfeld standardmäßig auf den zuvor vom Benutzer ausgewählten Pfad verweisen.

Wenn Sie keinen anfänglichen Ordnerpfad in der OPENFILENAME-Struktur bereitstellen, zeigt GetSaveFileName (oder GetOpenFileName) das Standard-Dialogfeld Datei speichern (oder Datei öffnen) an, das auf den Ordner Eigene Dateien verweist. Außerdem verweisen diese Funktionen automatisch auf den zuvor verwendeten Ordner, wenn der Benutzer zuvor eines dieser Dialogfelder verwendet und einen nicht standardmäßigen Ordner ausgewählt hat.

Um die empfohlene Praxis zu unterstützen, auf einen bestimmten Ordnerpfad (wie Eigene Bilder) zu verweisen, wenn der Benutzer das erste Mal eine Datei speichert oder öffnet, und nachfolgend standardmäßig auf den zuvor vom Benutzer ausgewählten Ordnerpfad zu verweisen, sollten Sie eine Boolesche Variable verwenden, um nachzuverfolgen, ob der Benutzer die Operation Speichern oder Öffnen das erste Mal durchgeführt hat.
  1. Erstellen Sie in der OnFileSaveAs-Funktion eine statische boolsche Variable mit dem Namen bFirstSave und setzen Sie sie anfänglich auf TRUE.
  2. Ändern Sie den Code in OnFileSaveAs so, dass SHGetFolderPath nur aufgerufen und der lpstrInitialDir-Member der OPENFILENAME-Struktur nur gesetzt wird, wenn bFirstSave den Wert TRUE hat.
  3. Wenn der Benutzer im Dialogfeld Datei speichern auf Speichern klickt, setzen Sie bFirstSaveauf FALSE.

    Ihr Code sollte folgendermaßen aussehen:
    void OnFileSaveAs()
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
       static BOOL bFirstSave = TRUE;
    
    // Initialize OPENFILENAME structure.
    ZeroMemory( &openFile, sizeof(OPENFILENAME) );
    openFile.lStructSize = sizeof(OPENFILENAME);
    // The first time the user saves a document, default to My Pictures.
       if ( TRUE == bFirstSave )
    {
       if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_MYPICTURES, 
                                             NULL, 0, szPath ) ) )
       {
             // Set lpstrInitialDir to the path that SHGetFolderPath obtains.
             // This causes GetSaveFileName to point to the My Pictures folder.
             openFile.lpstrInitialDir = szPath;
       }
    }
    // Display standard File Save dialog box, defaulting to My Pictures
    // or the user's previously selected location.
    if ( GetSaveFileName( &openFile ) == TRUE )
    {
       // User clicks Save.
       // Save the file.
          bFirstSave = FALSE;
    }
    else
    {
          // User cancels the File Save dialog box.
    }
    }

Überprüfen der vorherigen Benutzerauswahl

  1. Erstellen Sie das Projekt und führen Sie die Anwendung aus.
  2. Klicken Sie im Menü Datei auf Speichern unter.
  3. Gehen Sie vom Ordner Eigene Bilder zum Ordner Eigene Dateien, wählen Sie eine Datei aus und klicken Sie auf Speichern.
  4. Klicken Sie im Menü Datei erneut auf Speichern unter.
  5. Überprüfen Sie, ob das Dialogfeld standardmäßig auf die vorherige Auswahl (in diesem Fall Eigene Dateien) verweist.
  6. Klicken Sie auf Abbrechen, um das Dialogfeld zu schließen, und schließen Sie die Anwendung.
  7. Führen Sie die Anwendung aus und klicken Sie im Menü Datei auf Speichern unter.
  8. Überprüfen Sie, ob das Dialogfeld wieder auf den Ordner Eigene Bilder verweist.
  9. Schließen Sie das Dialogfeld und beenden Sie die Anwendung.

Klassifizieren von Anwendungsdaten

Sie sollten Anwendungsdaten (wie temporäre Dateien, Benutzereinstellungen, Anwendungs-Konfigurationsdateien etc.) nicht im Ordner Eigene Dateien speichern. Verwenden Sie stattdessen entweder einen entsprechenden Ort in der Windows-Registrierung (für Daten mit maximal 64 KB) oder eine anwendungsspezifische Datei, die sich in einem gültigen Anwendungsdaten-Ordner befindet.

Die Speicherung der Anwendungsdaten unter dem korrekten Pfad ist dafür wichtig, dass mehrere Personen denselben Computer verwenden können, ohne Daten und Einstellungen des jeweils anderen Benutzers zu beschädigen oder zu überschreiben, .

Um das am besten geeignete Verzeichnis für Ihre Anwendungsdaten zu bestimmen, verwenden Sie die folgenden Kategorien, um Ihre Daten zu klassifizieren:
  • Für einzelnen Benutzer (servergespeichert): Diese Kategorie umfasst Anwendungsdaten, die sich speziell auf einen bestimmten Benutzer beziehen und auch dann verfügbar sein sollten, wenn dieser Benutzer den Computer innerhalb einer Domäne wechselt (zum Beispiel ein Benutzerwörterbuch). Beachten Sie, dass diese Einstellung nicht für Anwendungen gilt, die nicht für die Ausführung in einer Domänenumgebung vorgesehen sind.
  • Für einzelnen Benutzer (nicht servergespeichert): Diese Kategorie umfasst Anwendungsdaten, die sich speziell auf einen bestimmten Benutzer beziehen und nur für einen einzigen Computer gelten (zum Beispiel eine benutzerdefinierte Bildschirmauflösung).
  • Für einzelnen Computer (nicht benutzerspezifisch und nicht servergespeichert): Diese Kategorie umfasst Anwendungsdaten, die sich auf alle Benutzer, aber nur auf einen speziellen Computer beziehen (zum Beispiel ein Anwendungswörterbuch, eine Protokolldatei oder eine temporäre Datei).

Speichern von Anwendungsdaten unter korrektem Pfad

Mit der SHGetFolderPath-Funktion rufen Sie den korrekten Anwendungsdaten-Ordner ab. Speichern Sie Anwendungsdaten nicht direkt in diesem Ordner. Verwenden Sie stattdessen die PathAppend-Funktion, um einen Unterordner an den Pfad anzufügen, den SHGetFolderPath zurückgibt. Stellen Sie sicher, dass Sie die folgende Konvention verwenden:
Firmenname\Produktname\Produktversion
Beispielsweise kann der vollständige Pfad folgendermaßen aussehen:
\Dokumente und Einstellungen\All Users\Anwendungsdaten\Eigene Firma\Eigenes Produkt\1.0
Um den korrekten Anwendungsdaten-Ordner zu finden, übergeben Sie den entsprechenden CSIDL-Wert auf Grundlage der Kategorie Ihrer Anwendungsdaten.
  • Verwenden Sie für Daten "Für einzelnen Benutzer (servergespeichert)" den CSIDL_APPDATA-Wert. Dieser verweist standardmäßig auf den folgenden Pfad:
    \Dokumente und Einstellungen\<Benutzername>\Anwendungsdaten
  • Verwenden Sie für Daten "Für einzelnen Benutzer (nicht servergespeichert)" den CSIDL_LOCAL_APPDATA-Wert. Dieser verweist standardmäßig auf den folgenden Pfad:
    \Dokumente und Einstellungen\<Benutzername>\Lokale Einstellungen\Anwendungsdaten
  • Verwenden Sie für Daten "Für einzelnen Computer (nicht benutzerspezifisch und nicht servergespeichert)" den CSIDL_COMMON_APPDATA-Wert. Dieser verweist standardmäßig auf den folgenden Pfad:
    \Dokumente und Einstellungen\All Users\Anwendungsdaten
Das folgende Codefragment zeigt, wie Sie eine temporäre Protokolldatei öffnen, die sich unter CSIDL_COMMON_APPDATA befindet:
void CreateTemporaryFile()
{
   TCHAR szPath[MAX_PATH];
   // Get path for each computer, non-user specific and non-roaming data.
   if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_COMMON_APPDATA, 
                                    NULL, 0, szPath ) ) )
   {
      TCHAR szTempFileName[MAX_PATH];
      // Append product-specific path.
      PathAppend( szPath, "\\My Company\\My Product\\1.0\\" );
      // Generate a temporary file name within this folder.
      if (GetTempFileName( szPath, 
                           "PRE",
                           0,
                           szTempFileName ) != 0 )
      {
         HANDLE hFile = NULL;
         // Open the file.
         if (( hFile = CreateFile( szTempFileName, 
                                     GENERIC_WRITE, 
                                     0, 
                                   NULL, 
                                   CREATE_ALWAYS, 
                                   FILE_ATTRIBUTE_NORMAL, 
                                   NULL )) != INVALID_HANDLE_VALUE )
         {
            // Write temporary data (code omitted).
            CloseHandle( hFile );
         }
      }
   }
}

Umsichtiges Verwenden der Registrierung

Achtung: Die unkorrekte Verwendung des Registrierungseditors kann schwerwiegende Probleme verursachen, die das gesamte System betreffen und eine Neuinstallierung des Betriebssystems erforderlich machen. Microsoft kann nicht garantieren, dass Probleme, die von einer falschen Verwendung des Registrierungseditors herrühren, behoben werden können. Benutzen Sie den Registrierungseditor auf eigene Verantwortung.

Sie können kleine Mengen von Anwendungsdaten auch in der Registrierung speichern. Daten mit mehr als 64 KB müssen in einem Anwendungsdaten-Ordner gespeichert werden. Wenn Sie Anwendungsdaten in der Registrierung speichern, sind folgende Richtlinien zu beachten:
  • Verwenden Sie für kleine Mengen von Benutzerdaten den Registrierungsschlüssel HKEY_CURRENT_USER (HKCU).
  • Verwenden Sie für kleine Mengen von Computerdaten den Registrierungsschlüssel HKEY_LOCAL_MACHINE (HKLM). Ihre Anwendung sollte nicht zur Laufzeit in HKLM schreiben, weil Benutzer, die keine Administratoren sind, standardmäßig nur Lesezugriff auf die HKLM-Struktur haben.
  • Zur Installationszeit darf Ihre Anwendung nicht mehr als insgesamt 128 KB unter HKCU und HKLM speichern.
  • Component Object Model (COM)-Komponenten werden unter dem Registrierungsschlüssel HKEY_CLASSES_ROOT (HKCR) registriert. Der Maximalwert von 128 KB schließt HKCR nicht ein.
  • Wenn Sie in HKLM oder HKCU schreiben, müssen Sie wie folgt Schlüssel für den Firmennamen, den Produktnamen und die Produktversion schreiben:
    HKLM\Software\Firmenname\Produktname\Produktversion
    HKCU\Software\Firmenname\Produktname\Produktversion
  • Verwenden Sie die Registrierungsfunktionen (wie RegCreateKeyEx und RegSetValueEx), um Registrierungseinträge zu lesen und zu schreiben.

Problembehandlung

  • Um sicherzustellen, dass Anwendungen nicht nur auf Windows XP, sondern auch auf früheren Windows-Versionen laufen, stellen Sie immer eine Verknüpfung zur SHGetFolderPath-Implementierung in Shfolder.dll her. Windows XP enthält zwar SHGetFolderPath in Shell32.dll, jedoch unterstützen frühere Versionen von Windows möglicherweise nicht die Funktion in dieser Dynamic-Link Library (DLL).
  • Shfolder.dll ist eine verteilbare Komponente und kann unter Ihren Anwendungen verteilt werden.
  • Speichern Sie keine vollqualifizierten Pfade zum Ordner Eigene Dateien (oder anderen Systemordnern) in einem anwendungsspezifischen Ordner wie einer Liste der zuletzt verwendeten Dateien: Ein Benutzer oder Administrator kann diese Ordner zwischen aufeinanderfolgenden Verwendungen Ihrer Anwendung verschieben.

Informationsquellen

Weitere Informationen über den vollständigen Satz von Ordnern, den SHGetFolderPath identifizieren kann, finden Sie unter der folgenden Microsoft Software Development Kit (SDK)-Dokumentation:
CSIDL
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp
Weitere Informationen zur allgemeinen Shell-Programmierung finden Sie auf der folgenden MSDN-Website:
Shell Programmers Guide
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/shell_intro.asp
Allgemeinere Informationen über Visual C++ .NET finden Sie in folgenden Microsoft-Newsgroups:
Microsoft.public.de.german.entwickler.dotnet.vc

Microsoft.public.dotnet.languages.vc
Besuchen Sie auch das Visual C++ .NET Support Center auf der folgenden Microsoft-Website:
Visual C++ .NET (2002) Support Center
http://support.microsoft.com/default.aspx?xmlid=fh%3BDE%3Bvcnet

Eigenschaften

Artikel-ID: 310294 - Geändert am: Mittwoch, 24. September 2003 - Version: 1.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ .NET 2002 Standard Edition, wenn verwendet mit:
    • Microsoft Windows XP Professional
  • Microsoft Visual C++ .NET 2003 Standard Edition, wenn verwendet mit:
    • Microsoft Windows XP Professional
Keywords: 
kbhowto KB310294
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com