¿Cómo elegir la arquitectura del procesador para instalar un MSI con Delphi
-
27-09-2019 - |
Pregunta
Buenas noticias: Una versión principal está en la bolsa
Las malas noticias: Me acabo de enterar (2 semanas demasiado tarde) que algunas personas no tienen MSXML 6 en sus máquinas y el nuevo instalador estamos desarrollando así lo requiere.
Buenas noticias: Podemos distribuir un archivo MSI para instalar MSXML
Las malas noticias: Hay tres archivos MSI para elegir, uno 'normal' uno, uno que termina en IA64 y uno que termina en x64.
tengo a mi disposición, Delphi 7, C ++ y um ... Los archivos por lotes ... ¿Cómo hago una de esas útil Setup.exe de que elija el MSI derecho a poner en marcha automáticamente.
Solución
Breve respuesta: Utilice el GetSystemInfo
función de la API de Windows para saber si el sistema es de 32 bits o 64 bits.
Ejemplo código:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
var
si: TSystemInfo;
const
PROCESSOR_ARCHITECTURE_AMD64 = 9;
PROCESSOR_ARCHITECTURE_IA64 = 6;
PROCESSOR_ARCHITECTURE_INTEL = 0;
PROCESSOR_ARCHITECTURE_UNKNOWN = $FFFF;
begin
GetSystemInfo(si);
case si.wProcessorArchitecture of
PROCESSOR_ARCHITECTURE_AMD64: Writeln('AMD64');
PROCESSOR_ARCHITECTURE_IA64: Writeln('IA64');
PROCESSOR_ARCHITECTURE_INTEL: Writeln('Intel');
PROCESSOR_ARCHITECTURE_UNKNOWN: Writeln('Unknown');
end;
Readln;
end.
Las dos salidas más comunes son 'Intel' (x86 32-bit) y 'AMD64' (x64 de 64 bits). De hecho, puede hacer más o menos confianza de que obtendrá uno de ellos.
Ahora, en realidad, creo que el anterior programa siempre de retorno 'de Intel (x86 de 32 bits), ya que todas las aplicaciones Delphi son de 32 bits, por lo que se emulan en virtud de un 64 bits de Windows (utilizando WOW64) -. no hay una versión de 64 bits del compilador de Delphi y el IDE
Así que para obtener el true arquitectura del sistema, independientemente de la emulación, usted tiene que utilizar el GetNativeSystemInfo
función. No hay un contenedor para esta función, por lo que tiene que importar a sí mismo de kernel32.dll.
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
var
si: TSystemInfo;
const
PROCESSOR_ARCHITECTURE_AMD64 = 9;
PROCESSOR_ARCHITECTURE_IA64 = 6;
PROCESSOR_ARCHITECTURE_INTEL = 0;
PROCESSOR_ARCHITECTURE_UNKNOWN = $FFFF;
procedure GetNativeSystemInfo(var lpSystemInfo: TSystemInfo); stdcall; external kernel32 name 'GetNativeSystemInfo';
begin
GetNativeSystemInfo(si);
case si.wProcessorArchitecture of
PROCESSOR_ARCHITECTURE_AMD64: Writeln('AMD64');
PROCESSOR_ARCHITECTURE_IA64: Writeln('IA64');
PROCESSOR_ARCHITECTURE_INTEL: Writeln('Intel');
PROCESSOR_ARCHITECTURE_UNKNOWN: Writeln('Unknown');
end;
Readln;
end.
Otros consejos
Se puede olvidar el IA64 que es para los sistemas Itanium. Que haría uso de una herramienta para crear una configuración (hay excelentes que son gratis, como InnoSetup). Se detectarán qué tipo de sistema de la instalación hasta se está ejecutando sobre, y que pueda ejecutar el instalador apropiado de msxml. Si la herramienta es compatible con el motor de Windows Installer directamente puede tomar ventaja de los módulos de combinación (MSM) para distribuir los tiempos de ejecución necesarios, de lo contrario es bastante fácil de ejecutar un msi desde el instalador. También puede escribir su propio instalador, pero se obtiene otra aplicación para escribir, probar y MANTENER. Me aprovecho de las ya existentes para tal tarea a.