Como escolher a arquitetura do processador para instalar um MSI com Delphi
-
27-09-2019 - |
Pergunta
Boas notícias: um grande lançamento está na bolsa!
Más notícias: acabei de descobrir (duas semanas tarde demais) que algumas pessoas não têm MSXML 6 em suas máquinas e o novo instalador que estamos lançando exige.
Boas notícias: podemos distribuir um arquivo msi para instalar o msxml
Más notícias: existem três arquivos MSI para escolher, um 'normal', um terminando no IA64 e um terminando no x64.
Eu tenho à minha disposição, Delphi 7, C ++ e UM ... arquivos em lote ... Como faço para fazer um desses práticos setup.exe que escolhe o MSI certo para iniciar automaticamente.
Solução
Resposta curta: Use o GetSystemInfo
Função da API do Windows para descobrir se o sistema é de 32 bits ou 64 bits.
Código de exemplo:
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.
As duas saídas mais comuns são 'Intel' (x86 de 32 bits) e 'AMD64' (x64 de 64 bits). De fato, você pode confiar mais ou menos que receberá um deles.
Agora, na realidade, acredito que o programa acima irá sempre Retorne 'Intel' (X86 de 32 bits) porque todos os aplicativos Delphi são de 32 bits e, portanto, são emulados sob um Windows de 64 bits (usando Wow64)-não há liberação de 64 bits do compilador Delphi e IDE.
Então, para obter o verdadeiro Arquitetura do sistema, independentemente da emulação, você deve usar o GetNativeSystemInfo
função. Não há embalagem para esta função, então você deve importar -a do 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.
Outras dicas
Você pode esquecer o IA64, que é para os sistemas de Itanium. Eu usaria uma ferramenta para criar uma configuração (existem excelentes livres, como o Innostup). Eles detectarão em que tipo de sistema a configuração está sendo executada e permitirá que você execute o instalador adequado do MSXML. Se a ferramenta suportar o mecanismo do Windows Installer diretamente, poderá aproveitar os módulos de mesclagem (MSM) para distribuir os horários de execução necessários, caso contrário, será muito fácil executar um MSI no instalador. Você também pode escrever seu próprio instalador, mas obtém outro aplicativo para escrever, testar e mantain. Eu aproveitava os existentes para essa tarefa.