Comment faire pour obtenir l'emplacement des dossiers spéciaux pour une DLL de migration

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

Résumé

Lors d'une mise à niveau de Windows 95 ou Windows 98 vers Windows 2000 Professionnel, il se peut qu'une DLL de migration tente d'accéder à des dossiers spéciaux, tels que le dossier du menu Démarrer ou le dossier Bureau. Une DLL de migration ne peut pas supposer que ces dossiers existent aux emplacements par défaut. Elle doit plutôt utiliser SHGetSpecialFolderPath ou SHGetFolderPath.

Plus d'informations

SHGetSpecialFolderPath ne fonctionne sous Windows 95 que si Internet Explorer 4.0 est installé avec la mise à jour du Bureau. Dans Windows 2000, SHGetSpecialFolderPath fonctionne toujours. Toutefois, dans les deux cas, il est recommandé d'utiliser la nouvelle API SHGetFolderPath (un sur-ensemble de SHGetSpecialFolderPath). Pour utiliser SHGetFolderPath sur un ordinateur Windows 95 ou Windows 98, vous devez redistribuer le fichier SHFolder.dll avec la DLL de migration.

Vous pouvez obtenir le fichier SHFolder.dll à partir du dernier Kit de développement Platform SDK. Pour télécharger le Kit de développement Platform SDK, reportez-vous au site Web de Microsoft à l'adresse suivante :
http://www.microsoft.com/msdownload/platformsdk/setuplauncher.htm(En Anglais)
Lors de l'installation du Kit de développement Platform SDK, assurez-vous d'installer les composants redistribuables et l'environnement de génération. Choisissez aussi d'intégrer le Kit de développement Platform SDK à Microsoft Visual C++ lorsque le système vous le demande. Cette étape est indispensable, car le fichier SHFolder.h est nécessaire. Une fois le Kit de développement Platform SDK installé, recherchez le fichier exécutable SHFolder.exe redistribuable dans le dossier d'installation. Ce fichier installe SHFolder.dll et toutes les autres mises à jour nécessaires pour qu'il puisse être exécuté sous Windows 95 ou Windows 98. Il doit être exécuté sur l'ordinateur de l'utilisateur lorsque ce dernier place la DLL de migration sur l'ordinateur. Il peut aussi être installé au cours de l'installation de votre application.

Le code suivant illustre comment obtenir un pointeur vers l'API SHGetFolderPath :
#include <windows.h>
#include <shfolder.h>

PFNSHGETFOLDERPATHA GetFuncPtr_SHGetFolderPathA()
{
   static HMODULE hMod = NULL;
   PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;

   // Load SHFolder.dll only once
   if (!hMod)
      hMod = LoadLibrary("SHFolder.dll");

   if (hMod)
      // Obtain a pointer to the SHGetFolderPathA function
      pSHGetFolderPath = (PFNSHGETFOLDERPATHA)GetProcAddress(hMod, 
         "SHGetFolderPathA");

   return pSHGetFolderPath;
}
				

L'exemple de code suivant illustre une utilisation possible de cette fonction. Lors d'une mise à niveau vers Windows 2000, une application peut contenir un programme ou un utilitaire propre à Windows 2000 nécessitant un raccourci dans le dossier Programmes du menu Démarrer de l'application. Une fois le nouveau programme copié sur l'ordinateur, la DLL de migration peut ajouter un raccourci au menu Démarrer de l'utilisateur. Pour un paramètre individualisé à chaque utilisateur, il est recommandé d'utiliser la fonction MigrateUserNT pour effectuer cette tâche.

La fonction suivante accepte trois paramètres : le premier est le chemin d'accès au fichier exécutable cible. Le second est une description. Le troisième est un sous-dossier qui sera créé dans le dossier Programmes du menu Démarrer. Il s'agit de l'emplacement où sera créé le raccourci.
#include <windows.h>
#include <objbase.h>
#include <shlobj.h>
#include <shfolder.h>

HRESULT CreateUserStartMenuShortcut(LPSTR pszShortcutFile,
            LPSTR pszDescription, LPTSTR pszRelativeFolder)
{
   HRESULT hr;
   PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;
   TCHAR pszLink[MAX_PATH];
   BOOL bFound = FALSE;

   pSHGetFolderPath = GetFuncPtr_SHGetFolderPathA();

   // Find the current user's Start Menu Programs folder
   if (pSHGetFolderPath)
      bFound = SUCCEEDED(pSHGetFolderPath(NULL, CSIDL_PROGRAMS, 
                           NULL, SHGFP_TYPE_CURRENT, pszLink));

   if (bFound)
   {
      // Proceed to create the shortcut
      IShellLink *pIShellLink = NULL;
      IPersistFile *ppf = NULL;
      WCHAR pLinkUnicode[MAX_PATH];

      CoInitialize(NULL);

      // Get a pointer to the IShellLink interface.
      hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                            IID_IShellLink, (void **)&pIShellLink);

      if (SUCCEEDED(hr))
      {
         // Get a pointer to IPersistFile interface for saving shortcut
         hr = pIShellLink->QueryInterface(IID_IPersistFile, (void **)&ppf);

         if (SUCCEEDED(hr))
         {   
            hr = pIShellLink->SetPath(pszShortcutFile);
            hr = pIShellLink->SetDescription(pszDescription);

            if (SUCCEEDED(hr))
            {
               // Add the target folder to the Start Menu Programs path
               lstrcat(pszLink, "\\");
               lstrcat(pszLink, pszRelativeFolder);
               lstrcat(pszLink, "\\");

               // Create the directory if it does not exist
               CreateDirectory(pszLink,NULL);

               // Add the file name for the shortcut
               lstrcat(pszLink, pszDescription);
               lstrcat(pszLink, ".lnk");

               // Convert string to Unicode, and call IPersistFile::Save()
               MultiByteToWideChar(CP_ACP, 0, pszLink, -1, pLinkUnicode, MAX_PATH);
               hr = ppf->Save(pLinkUnicode, TRUE);
            }
            ppf->Release();
         }
         pIShellLink->Release();
      }
      CoUninitialize();
   }

   return hr;
}
				
Reportez-vous à la documentation relative à SHGetSpecialFolderPath et SHGetFolderPath pour déterminer les autres types de dossiers spéciaux pouvant être obtenus par ces fonctions. Notez dans l'exemple que CoInitialize et CoUninitialize sont appelés à l'intérieur de cette fonction. Si COM est utilisé dans d'autres fonctions, ces appels doivent être déplacés vers la fonction DllMain de la DLL de migration. Appelez CoInitialize pour la notification DLL_PROCESS_ATTACH et CoUninitialize pour la notification DLL_PROCESS_DETACH.

Références

Pour plus d'informations sur les DLL de migration, consultez la rubrique suivante dans MSDN Library :
Platform SDK ; Services de gestion ; Installation ; Interface migration-extension

Propriétés

Numéro d'article: 241733 - Dernière mise à jour: mercredi 28 mars 2007 - Version: 3.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professionnel
  • Microsoft Windows 98 Standard Edition
  • Microsoft Windows 95
Mots-clés : 
kbfaq kbhowto kbmigrate kbsetup KB241733
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