Compartir a través de


Ejemplo de creación de paquetes únicos

PUASample.msi es un ejemplo de un paquete de Windows Installer 5.0 de propósito doble que es capaz de instalarse en el contexto de instalación por usuario o por máquina en Windows Server 2008 R2 y Windows 7. Este paquete de ejemplo sigue las directrices de desarrollo que se describen en Creación de paquetes únicos.

Obtención de una copia del ejemplo

Una copia de este ejemplo y un editor de tablas de base de datos de Windows Installer, Orca.exe, se encuentran en los componentes de Windows SDK para desarrolladores de Windows Installer. El ejemplo y el editor de tablas se incluyen en el kit de desarrollo de software de Windows para Windows Server 2008 R2 y Windows 7 como los archivos de instalación de Windows Installer PUASample1.msi y Orca.msi.

Requisitos del sistema

El editor de base de datos, Orca.exe, necesita Windows Server 2008 R2 (y versiones anteriores) y Windows 7 (y versiones anteriores). El paquete de propósito doble, PUASample1.msi, se puede instalar en el contexto de instalación por máquina o por usuario en Windows Server 2008 R2 y Windows 7. PUASample1.msi solo se puede instalar en el contexto por máquina en Windows Server 2008 y versiones anteriores y en Windows Vista y versiones anteriores. Puede instalar el editor de base de datos para examinar el contenido de PUASample1.msi sin que sea necesario instalar el ejemplo. Para instalar los paquetes del ejemplo o del editor, asegúrese de que la directiva DisableMSI no esté establecida en un valor que bloquee las instalaciones de aplicación.

Identificación de un paquete de propósito doble

Los paquetes de propósito doble deben inicializar el valor de la propiedad MSIINSTALLPERUSER en 1. Esto permite identificar que el paquete es capaz de instalarse en el contexto por máquina o por usuario en Windows Server 2008 R2 y Windows 7. Establezca la propiedad MSIINSTALLPERUSER en el paquete solo si se escribió según lo que indican las directrices de desarrollo descritas en Creación de paquetes únicos y si tiene previsto proporcionar a los usuarios la opción de instalar el paquete en el contexto por usuario o por máquina. Un paquete de propósito doble también debe inicializar el valor de la propiedad ALLUSERS en 2. Esto especifica que el contexto de instalación predeterminado para la aplicación es por usuario. Si el valor de la propiedad ALLUSERS es cualquier valor distinto de 2, Windows Installer omite la propiedad MSIINSTALLPERUSER.

Use un editor de base de datos de Windows Installer, como Orca.exe, para examinar el contenido de PUASample1.msi. La tabla Property del paquete de ejemplo contiene las dos entradas siguientes.

Tabla Property (parcial)

Propiedad Value
ALLUSERS 2
MSIINSTALLPERUSER 1

 

Cuadro de diálogo personalizado para el contexto de instalación

La interfaz de usuario del paquete de ejemplo incluye un ejemplo de un cuadro de diálogo personalizado, VerifyReadyDialog, que permite a los usuarios seleccionar el contexto de instalación por usuario o por máquina en el momento de la instalación. La tabla Dialog contiene un registro que describe el cuadro de diálogo VerifyReadyDialog. El valor especificado en el campo de atributos es 39, porque este cuadro de diálogo usa los bits de estilo de diálogo msidbDialogAttributesVisible (1), msidbDialogAttributesModal (2), msidbDialogAttributesMinimize (4) y msidbDialogAttributesTrackDiskSpace (32). La barra de título del cuadro de diálogo muestra un título proporcionado por el valor de la propiedad ProductName.

Tabla Dialog (parcial)

Diálogo HCentering VCentering Ancho Alto Atributos Título Control_First Control_Default Control_Cancel
VerifyReadyDialog 50 50 480 280 39 [ProductName] InstallPerUser Siguientes Cancelar

 

La tabla Control contiene entradas para los controles que el cuadro de diálogo VerifyReadyDialog muestra. El cuadro de diálogo muestra los controles PushButton y un control Text. Todos los controles usan los atributos de control msidbControlAttributesEnabled (2) y msidbControlAttributesVisible (1). El control InstallPerMachine también usa el atributo de control ElevationShield, msidbControlAttributesElevationShield (8388608). Este atributo de control agrega el icono de elevación (icono de escudo) Control de cuentas de usuario (UAC) al control InstallPerMachine e informa al usuario que se requieren las credenciales de UAC para instalar la aplicación en el contexto por máquina. El valor del campo Text de la tabla Control es el estilo del texto y el texto que el control muestra. Vea la descripción del campo Text en el tema relacionado con la tabla Control para más información sobre cómo agregar texto a un control mediante estilos predefinidos.

Tabla Control (parcial)

Dialog_ Control Tipo Atributo Texto Control_Next
VerifyReadyDialog Cancelar PushButton 3 {\Tahoma10}&Cancelar Siguientes
VerifyReadyDialog Anterior PushButton 3 {\Tahoma10}<<&Anterior Cancelar
VerifyReadyDialog Siguientes PushButton 3 {\Tahoma10}&Siguiente >> InstallPerUser
VerifyReadyDialog Text2 Texto 3 ¿Está listo para completar la instalación suspendida?
VerifyReadyDialog InstallPerUser PushButton 3 {\Tahoma10}Instalar solo para &mí InstallPerMachine
VerifyReadyDialog InstallPerMachine PushButton 8388611 {\Tahoma10}Instalar para &todos Anterior
VerifyReadyDialog Cancelar PushButton 3 {\Tahoma10}&Cancelar Siguientes

 

La tabla ControlEvent especifica las acciones (ControlEvents) que el instalador lleva a cabo cuando el usuario interactúa con un control. Cuando un usuario activa el botón de comando InstallPerUser, la interfaz de usuario muestra un cuadro de diálogo OutOfDisk si la propiedad OutOfDiskSpace es 1, establece el valor de la propiedad MSIINSTALLPERUSER en 1, establece el valor de la propiedad ALLUSERS en 2, establece la propiedad MSIFASTINSTALL en 1, y devuelve un resultado. Dado que la propiedad MSIFASTINSTALL está establecida, no se genera ningún punto de restauración del sistema para la instalación. Cuando un usuario activa el botón de comando InstallPerMachine, la interfaz de usuario muestra un cuadro de diálogo OutOfDisk si la propiedad OutOfDiskSpace es 1, establece el valor de la propiedad ALLUSERS en 1, y devuelve un resultado.

Tabla ControlEvent (parcial)

Dialog_ Control_ Evento Argumento Condición Pedido de
VerifyReadyDialog InstallPerUser SpawnDialog OutOfDisk OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerUser EndDialog Valor devuelto OutOfDiskSpace <> 1 5
VerifyReadyDialog InstallPerUser [MSIINSTALLPERUSER] 1 1 2
VerifyReadyDialog InstallPerUser [ALLUSERS] 2 1 3
VerifyReadyDialog InstallPerMachine SpawnDialog OutOfDisk OutOfDiskSpace = 1 1
VerifyReadyDialog InstallPerMachine EndDialog Valor devuelto OutOfDiskSpace <> 1 3
VerifyReadyDialog InstallPerMachine [ALLUSERS] 1 1 2
VerifyReadyDialog InstallPerUser [MSIFASTINSTALL] 1 1 4

 

El control InstallPerUser se debe quitar de la interfaz de usuario de cualquier instalación con una versión de Windows Installer anterior a Windows Installer 5.0. La tabla ControlCondition del paquete de ejemplo contiene cuatro entradas que deshabilitan y ocultan el control InstallPerUser si la versión actual es anterior a Windows Installer 5.0. La tabla usa el valor de la propiedad VersionMsi y la sintaxis de instrucciones condicionales para definir esta condición. La acción que se especifica en el campo Action solo se realiza si la instrucción del campo Condition tiene un valor true.

Tabla ControlCondition (parcial)

Dialog_ Control_ Acción Condición
VerifyReadyDialog InstallPerUser Habilitar VersionMsi >= "5.00"
VerifyReadyDialog InstallPerUser Deshabilitar VersionMsi < "5.00"
VerifyReadyDialog InstallPerUser Mostrar VersionMsi >= "5.00"
VerifyReadyDialog InstallPerUser Ocultar VersionMsi < "5.00"

 

Especificación de una estructura de directorios

Use el editor de base de datos para examinar la tabla Directory de PUASample1.msi. El registro de la tabla Directory que tiene una cadena vacía en el campo Directory_Parent representa el directorio raíz de los árboles de directorio de origen y de destino. Si la propiedad TARGETDIR no está definida, el instalador establece su valor en el momento de la instalación en el valor de la propiedad ROOTDRIVE. Si la propiedad SourceDir no está definida, el instalador establece su valor en la ubicación del directorio que contiene el paquete de Windows Installer (archivo .msi). Los nombres de directorio se especifican con el formato corto|largo.

Tabla Directory (parcial)

Directorio Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .
ProgramMenuFolder TARGETDIR .
INSTALLLOCATION MyVendor Sample1|MSDN-PUASample1
MyVendor ProgramFilesFolder Msft|Microsoft

 

En el origen, esta tabla Directory se resuelve en las rutas de acceso de directorio siguientes.

\[SourceDir\]\\Msft\\Sample1 \[SourceDir\]

En el destino, la tabla Directory se resuelve en las rutas de acceso que se muestran en la tabla siguiente. El instalador establece los valores de las propiedades ProgramFilesFolder y ProgramMenuFolder en ubicaciones que dependen del contexto de instalación y si el sistema es la versión de 32 bits o 64 bits de Windows Server 2008 R2 y Windows 7. Las rutas de acceso a las carpetas de destino dependen de si el usuario selecciona una instalación por usuario o por máquina.

Contexto de instalación Sistema Ejemplos de rutas de acceso
Por máquina Windows Server 2008 R2 y Windows 7
Versión de 32 bits
%ProgramFiles%\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs
Por máquina Windows Server 2008 R2 y Windows 7
Versión de 64 bits
%ProgramFiles(x86)%\Msft\Sample1
%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs
Por usuario Windows Server 2008 R2 y Windows 7
Versión de 32 bits o 64 bits
%USERPROFILE%\AppData\Local\Programs\Msft\Sample1
%APPDATA%\Microsoft\Windows\Start Menu\Programs

 

Las aplicaciones por usuario se deben almacenar en subcarpetas en la carpeta Programas especificada por el valor de la propiedad ProgramFilesFolder. Por lo general, la ruta de acceso a la aplicación tiene el formato siguiente.

%LOCALAPPDATA%\Programs\Nombre del ISV\AppName.

Los datos de configuración por usuario se deben almacenar en la carpeta Programas especificada por el valor de la propiedad ProgramMenuFolder. Por lo general, esta carpeta se encuentra en la ruta de acceso siguiente.

%APPDATA%\Microsoft\Windows\Start Menu\Programs

Si instala componentes del paquete de Windows Installer de 32 bits, use las propiedades ProgramFilesFolder y CommonFilesFolder en la tabla Directory. Si instala componentes del paquete de Windows Installer de 64 bits, use las propiedades ProgramFiles64Folder y CommonFiles64Folder. Si la aplicación contiene versiones de 32 bits y 64 bits del mismo componente, con el mismo nombre, asegúrese de que estas versiones se guarden en directorios distintos o asígneles nombres diferentes.

En la tabla Directory siguiente, se proporciona un ejemplo de un diseño de directorio compatible con un paquete que incluye componentes de 32 y 64 bits e incluye algunos componentes que se comparten entre las distintas aplicaciones.

Directorio Directory_Parent DefaultDir
TARGETDIR SourceDir
ProgramFilesFolder TARGETDIR .:Prog32
ProgramFiles64Folder TARGETDIR .:Prog64
CommonFilesFolder TARGETDIR .:Share32
CommonFiles64Folder TARGETDIR .:Share64
ProgramMenuFolder TARGETDIR .:Sample1|MSDN-PUASample1
INSTALLLOCATION MyVendor Sample1|MSDN-PUASample1
INSTALLLOCATIONX64 Vendorx64 Sample1|MSDN-PUASample1
SHAREDLOCATION ShVendor Sample1|MSDN-PUASample1
SHAREDLOCATIONX64 ShVendorx64 Sample1|MSDN-PUASample1
MyVendor ProgramFilesFolder Msft|Microsoft
Vendorx64 ProgramFiles64Folder Msft|Microsoft
ShVendor CommonFilesFolder Msft|Microsoft
ShVendorx64 CommonFiles64Folder Msft|Microsoft
Shrx86 SHAREDLOCATION x32|32-bit components
Shrx64 SHAREDLOCATIONX64 x64|64-bit components
Binx86 INSTALLLOCATION x32|32-bit components
Binx64 INSTALLLOCATIONX64 x64|64-bit components
App32 Binx86 myapp|unshared 32-bit components
App64 Binx64 myapp|unshared 64-bit components
Share32 Shrx86 shared|shared 32-bit components
Share64 Shrx64 shared|shared 64-bit components

 

En el origen, esta tabla Directory se resuelve en las rutas de acceso de directorio siguientes.

\[SourceDir\]Prog32\\Msft\\Sample1\\x32\\myapp \[SourceDir\]Share32\\Common Files\\Msft\\Sample1\\x32\\shared \[SourceDir\]Prog64\\Msft\\Sample1\\x64\\myapp \[SourceDir\]Share64\\Common Files\\Msft\\Sample1\\x64\\shared \[SourceDir\]Sample1

En el destino, esta tabla Directory se resuelve en las rutas de acceso de directorio siguientes. Las rutas de acceso de destino dependen del contexto de instalación y del sistema.

Contexto de instalación Sistema Ejemplos de rutas de acceso
Por máquina Windows Server 2008 R2 y Windows 7
Versión de 32 bits
%ProgramFiles%\Msft\Sample1\x32\myapp
%ProgramFiles%\Common Files\Msft\Sample1\x32\shared
%ProgramFiles(x86)%\Msft\Sample1\x64\myapp
%ProgramFiles(x86)%\Common Files\Msft\Sample1\x64\shared
%ProgramData%\Microsoft\Windows\Start Menu\Programs\Sample1
Por máquina Windows Server 2008 R2 y Windows 7
Versión de 64 bits
%ProgramFiles(x86)%\Msft\Sample1\x32\myapp
%ProgramFiles(x86)%\Common Files\Msft\Sample1\x32\shared
%ProgramFiles%\Msft\Sample1\x64\myapp
%ProgramFiles%\Common Files\Msft\Sample1\x64\shared
%ProgramData%\Microsoft\Windows\Start Menu\Programs\Sample1
Por usuario Windows Server 2008 R2 y Windows 7
Versión de 32 bits o 64 bits
%LOCALAPPDATA%\Programs\Msft\Sample1\x32\myapp
%LOCALAPPDATA%\Programs\Common\Msft\Sample1\x32\shared
%LOCALAPPDATA%\Programs\Msft\Sample1\x64\myapp
%LOCALAPPDATA%\Programs\Common\Msft\Sample1\x64\shared
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Sample1

 

Registro de la aplicación

PUASample.msi agrega una subclave a la clave del Registro AppPaths para la aplicación y realiza registros que permiten guardar la información de la aplicación en el Registro bajo esta clave. Para más información sobre las rutas de acceso y el registro de la aplicación, consulte PerceivedTypes, SystemFileAssociations y Registro de aplicación en la sección de extensibilidad de shell de la Guía del desarrollador de shell. En el momento de la instalación, el usuario toma la decisión de instalar la aplicación en el contexto de instalación por usuario o por máquina. En el momento de crear el paquete de propósito doble, el desarrollador del paquete no puede saber si los registros se deben realizar en las claves HKEY_LOCAL_MACHINE o HKEY_CURRENT_USER.

El desarrollador del paquete define el identificador de archivo del archivo ejecutable del campo File de la tabla File.

Tabla File (parcial)

Archivo Component_ FileName FileSize Versión Idioma Atributos Secuencia
MyAppFile ProductComponent PUASAMP1.EXE|PUASample1.exe 81920 0 1

 

Los valores que se van a guardar en el Registro se pueden especificar en el campo Value de la tabla Registry como una cadena Formatted. Use el identificador de archivo definido en el campo File de la tabla File, y la convención [#filekey] del tipo Formatted, para especificar el valor predeterminado de la clave del Registro AppPaths. La acción INSTALL de nivel superior realiza las acciones en la tabla InstallExecuteSequence. Una vez que se completan las acciones CostInitialize, FileCost e InstallFinalize de esta tabla, Windows Installer reemplaza la subcadena [#MyAppFile] con formato en la tabla Registry con la ruta de acceso completa al archivo de aplicación.

El ejemplo define una propiedad personalizada, RegRoot, para contener la ubicación de la clave raíz y usa una acción personalizada para restablecer el valor de propiedad si el usuario elige una instalación por máquina. Use la propiedad personalizada RegRoot en cualquier valor de cadena con formato que haga referencia a la ubicación raíz. En la tabla Property, el paquete PUASample.msi define la propiedad personalizada y establece el valor de RegRoot en HKCU. Esto inicializa el valor de la propiedad para el contexto de instalación por usuario, el contexto predeterminado recomendado para los paquetes de propósito doble.

Tabla Property (parcial)

Propiedad Value
RegRoot HKCU

 

En la tabla CustomAction, el paquete define una acción personalizada denominada Set_RegRoot_HKLM. El valor del campo Type identifica esta acción como una acción personalizada estándar Tipo de acción personalizada 51. El significado de los campos Source y Target de la tabla CustomAction depende del tipo de acción personalizada. Para más información sobre los tipos estándar de acciones personalizadas, consulte Tipos de acciones personalizadas. El campo Source de la acción personalizada Set_RegRoot_HKLM especifica el valor de la propiedad RegRoot. Si el instalador lleva a cabo la acción personalizada Set_RegRoot_HKLM, restablece el valor de la propiedad RegRoot a HKLM.

Tabla CustomAction (parcial)

Acción Tipo Source Destino
Set_RegRoot_HKLM 51 [RegRoot] HKLM

 

La acción INSTALL de nivel superior lleva a cabo las acciones en la tabla InstallExecuteSequence, en la secuencia que se especifica en el campo Sequence de dicha tabla. El valor creado en el campo Sequence para la acción personalizada Set_RegRoot_HKLM (1501) especifica que esta acción personalizada se debe realizar después de la acción InstallInitialize (1500) y antes de la acción ProcessComponents (1600.) Esta secuencia garantiza que el registro de la acción personalizada Set_RegRoot_HKLM se evalúa en el momento de la instalación. Para más información sobre la secuencia recomendada de acciones en la tabla InstallExecuteSequence, consulte el tema Suggested InstallExecuteSequence. La sintaxis de instrucciones condicionales creada en el campo Condition especifica que la acción Set_RegRoot_HKLM se va a realizar solo si el valor de la propiedad ALLUSERS se evalúa en 1 en el momento de la instalación. Un valor 1 en la propiedad ALLUSERS especifica una instalación por máquina.

Tabla InstallExecuteSequence (parcial)

Acción Condición Secuencia
Set_RegRoot_HKLM ALLUSERS=1 1501

 

Los registros siguientes de la tabla Registry llevan a cabo los registros si está instalado el componente ProductComponent. Se requiere un valor -1 en el campo Root para llevar a cabo el registro en HKEY_LOCAL_MACHINE para una instalación por usuario y en HKEY_CURRENT_USER para una instalación por usuario. El registro con una cadena vacía en el campo Registry agrega una subclave para la aplicación en la clave del Registro AppPaths y establece el valor "(Default)" en la ruta de acceso completa del archivo ejecutable de la aplicación. El registro MyAppPathAlias asigna el archivo ejecutable a un alias de aplicación y permite que se inicie la aplicación si el usuario escribe el alias "puapct" en un símbolo de la línea de comandos. El registro MyAppPathRegistration asigna el nombre del archivo ejecutable a la ruta de acceso completa del archivo.

Registro Root Clave Nombre Value Componente
-1 Software\Microsoft\MyAppPathRegistrationLocation [RegRoot]\Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe ProductComponent
MyAppPathAlias -1 Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe [#MyAppFile] ProductComponent
MyAppPathRegistration -1 Software\Microsoft\Windows\CurrentVersion\App Paths\PUASample1.exe [#MyAppFile] ProductComponent

 

Registro de cancelación de reproducción automática

PUASample.msi lleva a cabo registros que permiten al usuario de la aplicación impedir que la Reproducción automática de hardware se inicie para los dispositivos seleccionados. Para información de cómo registrar un controlador para cancelar la reproducción automática en respuesta a un evento, consulte el tema Preparación de hardware y software para su uso con la Reproducción automática en la sección de extensibilidad de shell de la Guía del desarrollador de shell. El registro siguiente registra el controlador especificado en el campo Name cuando está instalado el componente ProductComponent. Se requiere un valor -1 en el campo Root para especificar en Windows Installer que el registro se debe redirigir a una ubicación que depende del contexto de instalación.

Tabla Registry

Registro Root Clave Nombre Value Componente
MyAutoplayCancelRegistration -1 SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\CancelAutoplay\CLSID 66A32FE6-229D-427b-A608-D273F40C034C ProductComponent

 

Registro del controlador de vista previa

PUASample.msi lleva a cabo registros que son necesarios para instalar un controlador de vista previa que permite obtener una vista previa de solo lectura de los archivos .pua sin iniciar la aplicación. Para información de cómo registrar controladores de vista previa, consulte el tema Registro de controladores de vista previa en la sección de extensibilidad de shell de la Guía del desarrollador de shell. Los registros siguientes de la tabla Registry registran el controlador cuando esté instalado el componente ProductComponent. Se requiere un valor -1 en el campo Root para especificar en Windows Installer que el registro se debe redirigir a una ubicación que depende del contexto de instalación.

Tabla Registry

Registro Root Clave Nombre Value Componente
MyPreviewHandlerRegistration1 -1 Software\Classes\.pua puafile ProductComponent
MyPreviewHandlerRegistration2 -1 Software\Microsoft\Windows\CurrentVersion\PreviewHandlers {1531d583-8375-4d3f-b5fb-d23bbd169f22} Microsoft Windows PUA TEST Preview Handler ProductComponent
MyPreviewHandlerRegistration3 -1 Software\Classes\puafile\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f} {1531d583-8375-4d3f-b5fb-d23bbd169f22} ProductComponent
MyPreviewHandlerRegistration4 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} Per-User Applicaton Sample 1 Preview Handler ProductComponent
MyPreviewHandlerRegistration5 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} AppID {6d2b5079-2f0b-48dd-ab7f-97cec514d30b} ProductComponent
MyPreviewHandlerRegistration6 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} DisplayName @shell32,-38242 ProductComponent
MyPreviewHandlerRegistration7 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} Icono notepad.exe,2 ProductComponent
MyPreviewHandlerRegistration8 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ThreadingModel Apartment ProductComponent
MyPreviewHandlerRegistration9 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 #%%SystemRoot%\system32\shell32.dll ProductComponent
MyPreviewHandlerRegistration10 -1 Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 ProgID puafile ProductComponent