Cómo obtener la ubicación de carpetas especiales para una DLL de migración

Seleccione idioma Seleccione idioma
Id. de artículo: 241733 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

Durante una actualización desde Windows 95 o Windows 98 a Windows 2000, una DLL de migración que desea tener acceso carpetas especiales, como la carpeta del menú Inicio o la carpeta escritorio. Una DLL de migración no se supone que estas carpetas predeterminadas en existen ubicaciones. En su lugar, debe utilizar SHGetSpecialFolderPath o SHGetFolderPath.

Más información

SHGetSpecialFolderPath sólo funcionará en Windows 95 si Internet Explorer 4.0 está instalado con la actualización de escritorio. En Windows 2000, SHGetSpecialFolderPath siempre funcionará. Sin embargo, en ambos casos, es mejor utilizar la nueva API SHGetFolderPath, que es un superconjunto de SHGetSpecialFolderPath. Para utilizar SHGetFolderPath en Windows 95 o Windows 98, debe redistribuir el archivo de SHFolder.dll along with la DLL de migración.

Puede obtener SHFolder.dll de Platform SDK más reciente. Para descargar el SDK, consulte el siguiente sitio Web:
http://www.microsoft.com/msdownload/platformsdk/setuplauncher.htm
Al instalar el SDK, asegúrese de instalar los componentes redistribuibles y el entorno de generación. Además, elegir integrar el SDK con Microsoft Visual C++ cuando se le pida. Esto es necesario debido al archivo SHFolder.h que es necesario. Una vez instalado el SDK, busque la carpeta de instalación el redistribuible SHFolder.exe ejecutable. Este archivo instala SHFolder.dll y todas las otras actualizaciones que son necesarios para que se ejecute en Windows 95 o Windows 98. Este archivo ejecutable debe ejecutarse en el equipo del usuario cuando el usuario coloca el archivo DLL de migración en el equipo. También se puede instalar durante la configuración de aplicación.

El código siguiente muestra cómo obtener un puntero a la 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;
}
				

En el siguiente ejemplo de código muestra un posible uso de esta función. Durante una actualización a Windows 2000, una aplicación puede contener un programa específico de Windows 2000 o una utilidad que requiere un acceso directo en la carpeta de programas del menú de Inicio de la aplicación. Después de copiar el nuevo programa en el equipo, la DLL de migración puede agregar un acceso directo a menú Inicio del usuario. Una configuración por usuario, la función MigrateUserNT es el mejor lugar para realizar esta tarea.

La siguiente función toma tres parámetros. El primer parámetro es la ruta de acceso al ejecutable de destino. El segundo parámetro es una descripción. El parámetro final es una subcarpeta que se crearán en la carpeta programas del menú Inicio . Esto es donde se creará el acceso directo.
#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;
}
				
Consulte la documentación para SHGetSpecialFolderPath y SHGetFolderPath para determinar los otros tipos de carpetas especiales que pueden obtener estas funciones. Tenga en cuenta en el ejemplo que se llama a dentro de esta función CoInitialize y CoUnitialize. Si se utiliza COM en otras funciones, se deben mover estas llamadas a función DllMain de la DLL de migración. Se llama a CoInitialize para obtener la notificación de DLL_PROCESS_ATTACH y CoUninitialize para la notificación DLL_PROCESS_DETACH.

Referencias

Para obtener más información sobre archivos DLL de migración, vea el tema siguiente en MSDN Library:
Platform SDK servicios de administración de instalación; interfaz de extensión de migración

Propiedades

Id. de artículo: 241733 - Última revisión: jueves, 01 de marzo de 2007 - Versión: 3.4
La información de este artículo se refiere a:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 98 Standard Edition
  • Microsoft Windows 95
Palabras clave: 
kbmt kbfaq kbhowto kbmigrate kbsetup KB241733 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 241733

Enviar comentarios

 

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