PROCÉDURE : BÊTA : Écrire une application Windows XP stockant les données de l'utilisateur et des applications dans l'emplacement correct

Traductions disponibles Traductions disponibles
Numéro d'article: 310294 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F310294
Agrandir tout | Réduire tout

Sommaire

Résumé

Les applications fonctionnent avec deux types de documents : les documents créés par l'utilisateur et ceux créés par l'application. Vos applications doivent utiliser la fonction shell SHGetFolderPath pour récupérer les emplacements de dossier valides pour le stockage des données spécifiques à l'utilisateur et à l'application. Ceci est essentiel pour que les applications Windows XP puissent prendre en charge plusieurs utilisateurs se servant du même ordinateur et pour permettre de passer rapidement de l'un à l'autre.

Cet article décrit les procédures suivantes pour stocker les données de l'utilisateur dans l'emplacement correct :
  • Création d'une application Win32.
  • Ajout d'une option Enregistrer sous au menu Fichier.
  • Utilisation de la boîte de dialogue standard Enregistrer du menu Fichier pour définir par défaut l'emplacement correct.
  • Vérification de l'emplacement correct d'enregistrement du fichier.
  • Rappel de la sélection précédente de l'utilisateur.
  • Vérification de la sélection précédente de l'utilisateur
Dans les procédures suivantes, cet article indique également où stocker les données des applications, ainsi que la façon de s'assurer que l'emplacement de stockage est correct :
  • Classification des données des applications.
  • Stockage des données des applications dans l'emplacement correct.
  • Utilisation judicieuse du registre.

Configuration requise

La liste suivante présente le matériel, les logiciels, l'infrastructure réseau, les compétences, les connaissances et les Service Packs recommandés dont vous avez besoin :
  • Windows XP Édition Familiale ou Windows XP Professionnel
  • Visual Studio .NET ou Visual Studio version 6.0
  • Connaissance préalable du développement des applications Win32

Création d'une application Win32

Démarrez Visual Studio et créez une nouvelle application Win32 nommée SavingData.
  • Dans Visual C++ 6.0, cliquez sur Application Win32 dans la liste des types de projets disponibles, puis sélectionnez l'option d'application standard " Hello World " dans l'Assistant Création d'applications.
  • Dans Visual Studio .NET, cliquez sur Projets Visual C++ sous Types de projets, puis sur Projet Win32 sous Modèles. Validez les paramètres d'application par défaut proposés par l'Assistant.

Ajout de l'option Enregistrer sous au menu Fichier

  1. Cliquez sur Affichage des ressources, puis double-cliquez sur IDC_SAVINGDATA.
  2. Ajoutez l'option de menu Enregistrer sous au menu Fichier. Utilisez IDM_FILE_SAVEAS comme ID de l'élément du menu.
  3. Localisez la procédure de fenêtre WndProc de l'application dans SavingData.cppm et ajoutez une nouvelle instruction case dans la section WM_COMMAND afin de traiter l'option de menu Enregistrer sous. Appelez la fonction OnFileSaveAs que vous créerez dans la section suivante. Cette fonction n'accepte aucun paramètre.

    Votre code doit apparaître comme suit :
    case WM_COMMAND:
       wmId    = LOWORD(wParam); 
       wmEvent = HIWORD(wParam); 
       // Analyser les sélections de menu.
       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;

Utilisation de la boîte de dialogue standard Enregistrer du menu Fichier pour définir par défaut l'emplacement correct

Lorsqu'un utilisateur affiche pour la première fois la boîte de dialogue Enregistrer (ou Ouvrir ) du menu Fichier d'une application, la boîte de dialogue doit afficher par défaut le dossier Mes documents de l'utilisateur (ou un descendant de ce dossier, tel que Mes images pour les données d'images ou Ma musique pour les fichiers audio).

REMARQUE : Vous ne devez jamais coder de manière irréversible un chemin d'accès dans une application étant donné qu'il est impossible de garantir son emplacement physique. Par exemple, un administrateur peut déplacer le dossier Mes Documents vers un emplacement réseau.
  1. En haut du fichier SavingData.cpp, ajoutez les instructions include suivantes :
    #include <commdlg.h>   // pour GetSaveFileName
    #include <shlobj.h>    // pour SHGetFolderPath
  2. Ajoutez le prototype suivant pour la fonction OnFileSaveAs :
    void  OnFileSaveAs();
  3. Créez la nouvelle fonction OnFileSaveAs. Dans cette fonction, utilisez la fonction SHGetFolderPath en association avec l'identificateur CSIDL_MYPICTURESCSIDL afin de récupérer l'emplacement de dossier correct pour le stockage des données d'images. Passez cet emplacement de dossier à la fonction GetSaveFileName pour afficher la boîte de dialogue standard Enregistrer du menu Fichier.

    Votre code doit apparaître comme suit :
    void  OnFileSaveAs()
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
    
    // Initialiser la structure OPENFILENAME.
    ZeroMemory( &openFile, sizeof(OPENFILENAME) );
    openFile.lStructSize = sizeof(OPENFILENAME);
    // Définir par défaut Mes images. Obtenir en premier lieu le chemin d'accès.
    if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_MYPICTURES, 
                                          NULL, 0, szPath ) ) )
    {
       // Définir le chemin d'accès obtenu par SHGetFolderPath comme valeur de lpstrInitialDir. 
       // GetSaveFileName pointe ainsi vers le dossier Mes images.
          openFile.lpstrInitialDir = szPath;
    }
    // Afficher la boîte de dialogue standard Enregistrer du menu Fichier, 
    définissant par défaut le dossier Mes images.
    if ( GetSaveFileName( &openFile ) == TRUE )
    {
          // L'utilisateur clique sur le bouton Enregistrer.
       // Enregistrer le fichier
    }
    else
    {
       // L'utilisateur annule la boîte de dialogue Enregistrer du menu Fichier.
    }
    }

Vérification de l'emplacement correct d'enregistrement du fichier

  1. Appuyez sur F5 pour générer le projet.
  2. Exécutez l'application et cliquez dans le menu Fichier sur Enregistrer sous.
  3. Assurez-vous que la boîte de dialogue standard Enregistrer du menu Fichier indique par défaut le dossier Mes images, comme le spécifie CSIDL_MYPICTURES.
  4. Cliquez sur Annuler pour fermer la boîte de dialogue et fermez l'application.

Rappel de la sélection précédente de l'utilisateur

Pour les utilisations ultérieures de la boîte de dialogue Enregistrer (ou Ouvrir) du menu Fichier, il est recommandé de faire en sorte que l'emplacement précédemment sélectionné par l'utilisateur soit défini par défaut.

Si vous n'indiquez pas d'emplacement de dossier initial à l'intérieur de la structure OPENFILENAME, GetSaveFileName et GetOpenFileName affichent la boîte de dialogue standard Enregistrer ou Ouvrir du menu Fichier, qui pointe vers le dossier Mes documents. Par ailleurs, si l'utilisateur a précédemment utilisé l'une de ces boîtes de dialogue et qu'il a sélectionné un dossier autre que celui par défaut, ces fonctions définissent automatiquement par défaut le dossier précédemment utilisé.

Pour prendre en charge la méthode conseillée consistant à cibler un emplacement de dossier spécifique (tel que Mes images) la première fois qu'un utilisateur enregistre ou charge un fichier, et pour faire en sorte que l'emplacement sélectionné précédemment soit l'emplacement par défaut par la suite, vous devez utiliser une variable Boolean afin de déterminer s'il s'agit de la première fois que l'utilisateur a effectué une opération d'enregistrement ou d'ouverture.
  1. Créez une variable static BOOL nommée bFirstSave dans la fonction OnFileSaveAs et initialisez-la en définissant la valeur TRUE.
  2. Modifiez le code dans OnFileSaveAs afin d'appeler SHGetFolderPath et définissez le membre lpstrInitialDir de la structure OPENFILENAME, uniquement si bFirstSave a la valeur TRUE.
  3. Si l'utilisateur clique sur Enregistrer dans la boîte de dialogue Enregistrer du menu Fichier, affectez la valeur FALSE à bFirstSave.

    Votre code doit apparaître comme suit :
    void  OnFileSaveAs()
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
       static BOOL bFirstSave = TRUE;
    
    // Initialiser la structure OPENFILENAME.
    ZeroMemory( &openFile, sizeof(OPENFILENAME) );
    openFile.lStructSize = sizeof(OPENFILENAME);
    // La première fois que l'utilisateur enregistre un document, définir par défaut Mes images.
       if ( TRUE == bFirstSave )
    {
       if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_MYPICTURES, 
                                             NULL, 0, szPath ) ) 
    )
       {      // Définir le chemin d'accès obtenu par SHGetFolderPath comme valeur de lpstrInitialDir.
             // GetSaveFileName pointe ainsi vers le dossier Mes images.
             openFile.lpstrInitialDir = szPath;
       }
    }
    // Afficher la boîte de dialogue standard Enregistrer du 
    menu Fichier, définissant par défaut le dossier Mes images
    // ou l'emplacement précédemment sélectionné par l'utilisateur.
    if ( GetSaveFileName( &openFile ) == TRUE )
    {
       // L'utilisateur clique sur Enregistrer.
       // Enregistrer le fichier.
          bFirstSave = FALSE;
    }
    else
    {
          // L'utilisateur annule la boîte de dialogue Enregistrer du menu Fichier.
    }
    }

Vérification de la sélection précédente de l'utilisateur

  1. Générez le projet et exécutez l'application.
  2. Dans le menu Fichier, cliquez sur Enregistrer sous.
  3. Passez du dossier Mes images au dossier Mes documents, sélectionnez un fichier et cliquez sur Enregistrer.
  4. Dans le menu Fichier, cliquez à nouveau sur Enregistrer sous.
  5. Assurez-vous que la boîte de dialogue définit par défaut votre sélection précédente (en l'occurrence, Mes documents).
  6. Cliquez sur Annuler pour faire disparaître la boîte de dialogue et fermez l'application.
  7. Exécutez l'application et cliquez dans le menu Fichier sur Enregistrer sous.
  8. Assurez-vous que la boîte de dialogue définit à nouveau par défaut le dossier Mes images.
  9. Fermez la boîte de dialogue et quittez l'application.

Classification des données des applications

Vous ne devez pas stocker les données spécifiques à l'application (telles que les fichiers temporaires, les préférences de l'utilisateur, les fichiers de configuration de l'application, etc.) dans le dossier Mes documents. Utilisez plutôt soit un emplacement approprié dans le registre Windows (pour les données d'une taille inférieure à 64 kilo-octets), soit un fichier spécifique à l'application situé dans un dossier des données des applications valide.

Il est important de stocker les données des applications dans un emplacement correct, afin de permettre à plusieurs utilisateurs de se servir du même ordinateur sans pour autant endommager ou écraser les données et les paramètres des autres utilisateurs.

Pour déterminer l'emplacement le mieux adapté pour les données des applications, utilisez les catégories suivantes pour classer vos données :
  • Pour chaque utilisateur (itinérant) : Cette catégorie décrit les données des applications spécifiques à un utilisateur donné (telles qu'un dictionnaire personnalisé) et devant être accessibles à celui-ci en cas de déplacement d'un ordinateur à un autre à l'intérieur d'un domaine. Notez que ce paramètre ne s'applique pas aux applications qui n'ont pas été conçues pour une exécution dans un environnement de domaines.
  • Pour chaque utilisateur (non itinérant) : Cette catégorie décrit les données des applications spécifiques à un utilisateur donné (telles que la résolution du moniteur définie par l'utilisateur), mais s'applique uniquement à un seul ordinateur.
  • Pour chaque ordinateur (non spécifique à un utilisateur et non itinérant) : Cette catégorie décrit les données des applications (telles que le dictionnaire d'une application, un fichier journal ou un fichier temporaire) s'appliquant à tous les utilisateurs et à un ordinateur en particulier.

Stockage des données des applications dans l'emplacement correct

Vous devez utiliser la fonction SHGetFolderPath pour récupérer le dossier de données des applications correct. Vous ne devez pas stocker les données des applications directement dans ce dossier. Utilisez plutôt la fonction PathAppend pour ajouter un sous-dossier au chemin d'accès que SHGetFolderPath renvoie. Assurez-vous d'utiliser la convention suivante :
Nom de la société\Nom du produit\Version du produit
Par exemple, le chemin d'accès complet obtenu peut se présenter comme suit :
\Documents and Settings\All Users\Application data\Ma société\Mon produit\1.0
Pour localiser le dossier de données des applications correct, passez la valeur CSIDL appropriée, selon la catégorie des données des applications.
  • Pour les données de la catégorie Pour chaque utilisateur (itinérant), utilisez la valeur CSIDL_APPDATA. Le chemin d'accès suivant est alors défini par défaut :
    \Documents and Settings\<Nom d'utilisateur>\Application Data
  • Pour les données de la catégorie Pour chaque utilisateur (non itinérant), utilisez la valeur CSIDL_LOCAL_APPDATA. Le chemin d'accès suivant est alors défini par défaut :
    \Documents and Settings\<Nom d'utilisateur>\Local Settings\Application Data
  • Pour les données de la catégorie Pour chaque ordinateur (non spécifique à un utilisateur et non itinérant), utilisez la valeur CSIDL_COMMON_APPDATA. Le chemin d'accès suivant est alors défini par défaut :
    \Documents and Settings\All Users\Application Data
Le fragment de code suivant montre comment ouvrir un fichier journal temporaire, situé sous CSIDL_COMMON_APPDATA :
void CreateTemporaryFile()
{
   TCHAR szPath[MAX_PATH];
   // Obtenir le chemin d'accès pour les données de la catégorie 
   Pour chaque ordinateur (non spécifique à un utilisateur et non itinérant).
   if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_COMMON_APPDATA, 
                                    NULL, 0, szPath ) ) )
   {
      TCHAR szTempFileName[MAX_PATH];
      // Ajouter le chemin d'accès spécifique au produit.
      PathAppend( szPath, "\\Ma société\\Mon produit\\1.0\\" );
      // Générer un nom de fichier temporaire dans ce dossier.
      if (GetTempFileName( szPath, 
                           "PRE",
                           0,
                           szTempFileName ) != 0 )
      {
         HANDLE hFile = NULL;
         // Ouvrir le fichier.
         if (( hFile = CreateFile( szTempFileName, 
                                     GENERIC_WRITE, 
                                     0, 
                                   NULL, 
                                   CREATE_ALWAYS, 
                                   FILE_ATTRIBUTE_NORMAL, 
                                   NULL )) != INVALID_HANDLE_VALUE )
         {
            // Écrire les données temporaires (code omis).
            CloseHandle( hFile );
         }
      }
   }
}

Utilisation judicieuse du registre

AVERTISSEMENT : Toute utilisation incorrecte de l'Éditeur du registre peut entraîner de graves problèmes vous obligeant à réinstaller votre système d'exploitation. Microsoft ne garantit en aucun cas que les problèmes résultant d'une utilisation incorrecte de l'Éditeur du registre peuvent être résolus. Vous assumez l'entière responsabilité des opérations effectuées avec cet outil.

Pour plus d'informations sur la procédure de modification du registre, consultez la rubrique d'aide " Modification des clés et des valeurs " dans l'Éditeur du registre (Regedit.exe) ou les rubriques d'aide " Ajouter et supprimer les informations dans le registre " et " Modifier les données du registre " dans Regedt32.exe. Notez que vous devez sauvegarder le registre avant de le modifier. Si vous travaillez sous Windows NT ou Windows 2000, nous vous conseillons également de mettre à jour votre disquette de réparation d'urgence.

Vous pouvez également utiliser le registre pour stocker de petites quantités de données des applications. Pour les données d'une taille supérieure à 64 kilo-octets (Ko), vous devez utiliser un dossier de données des applications. Suivez les instructions ci-dessous lorsque vous utilisez le registre pour stocker les données des applications :
  • Pour des quantités de données d'utilisateur réduites, utilisez la clé de registre HKEY_CURRENT_USER(HKCU).
  • Pour des quantités de données d'ordinateur réduites, utilisez la clé de registre HKEY_LOCAL_MACHINE(HKLM). Votre application ne doit pas écrire dans HKLM au moment de l'exécution car, par défaut, les utilisateurs qui ne sont pas administrateurs disposent uniquement d'un accès en lecture seule à l'arborescence HKLM.
  • Au moment de l'installation, votre application ne doit pas stocker plus de 128 Ko au total dans HKCU et HKLM.
  • Les composants COM (Component Object Model) sont inscrits sous la clé de registre HKEY_CLASSES_ROOT (HKCR). La taille maximale de 128 Ko n'inclut pas HKCR.
  • Lorsque vous écrivez dans HKLM ou HKCU, vous devez créer des clés pour le nom de la société, le nom du produit et le numéro de version du produit, comme suit :
    HKLM\Software\Nom de la société\Nom du produit\Version du produit
    HKCU\Software\Nom de la société\Nom du produit\Version du produit
  • Utilisez les fonctions du registre (telles que RegCreateKeyEx et RegSetValueEx) pour lire et écrire des entrées de registre.

Dépannage

  • Pour vous assurer que les applications s'exécutent sur des versions antérieures de Windows outre Windows XP, effectuez toujours une liaison vers l'implémentation de SHGetFolderPath dans ShFolder.dll. Bien que Windows XP inclue SHGetFolderPath dans le fichier Shell32.dll, il se peut que des versions antérieures de Windows ne prennent pas en charge la fonction dans cette bibliothèque de liaisons dynamique (DLL).
  • Shfolder.dll est un composant redistribuable et peut être distribué avec vos applications.
  • Ne stockez pas de chemins pleinement qualifiés d'accès au dossier Mes documents (ou d'autres dossiers système) dans un lieu spécifique à une application, tel que la liste des fichiers récemment utilisés, car il se peut qu'un utilisateur ou un administrateur déplace ces dossiers entre diverses utilisations de votre application.

RÉFÉRENCES

Pour plus d'informations sur l'ensemble des dossiers identifiables par SHGetFolderPath, consultez la documentation du Kit de développement logiciel de plate-forme Microsoft (Platform SDK) suivante :
Valeurs CSIDL
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/Functions/csidl.asp
Pour plus d'informations sur la programmation shell en général, consultez le site Web MSDN :
Shell Programmers Guide (Guide du programmeur shell)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/shell_intro.asp

Propriétés

Numéro d'article: 310294 - Dernière mise à jour: mardi 24 février 2004 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Windows XP Édition familiale
  • Microsoft Windows XP Professionnel
Mots-clés : 
kbhowto KB310294
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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