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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top