Как выбрать архитектуру процессора для установки MSI с Delphi

Хорошие новости: главный релиз в сумке!

Плохая новость: я только что узнал (на 2 недели позже), что некоторые люди не имеют MSXML 6 на своих машинах, и новый установщик, который мы выпускаем, требует этого.

Хорошие новости: мы можем распространять MSI-файл для установки MSXML

Плохая новость: на выбор предлагается три файла MSI: один "нормальный", один, заканчивающийся на ia64, и один, заканчивающийся на x64.

В моем распоряжении Delphi 7, C++ и... Пакетные файлы... Как мне сделать один из тех полезных Setup.exe, которые выбирают правильный MSI для автоматического запуска.

2 ответа

Решение

Краткий ответ: используйте GetSystemInfo Функция Windows API для определения, является ли система 32-битной или 64-битной.

Пример кода:

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.

Двумя наиболее распространенными выходами являются Intel (32-разрядная x86) и AMD64 (64-разрядная x64). На самом деле, вы можете более или менее доверять, что вы получите один из них.

Теперь, на самом деле, я считаю, что вышеприведенная программа всегда будет возвращать 'Intel' (32-битный x86), потому что все приложения Delphi являются 32-битными, и поэтому они эмулируются под 64-битной Windows (используя WOW64) - там нет 64-битной версии компилятора Delphi и IDE.

Таким образом, чтобы получить истинную архитектуру системы, независимо от эмуляции, вы должны использовать GetNativeSystemInfo функция. Оболочки для этой функции нет, поэтому вам придется импортировать ее самостоятельно из 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.

Вы можете забыть IA64, который предназначен для систем Itanium. Я бы использовал инструмент для создания настроек (есть отличные бесплатные, такие как InnoSetup). Они определят, на какой системе выполняется установка, и позволят вам запустить соответствующий установщик msxml. Если инструмент поддерживает механизм установщика Windows напрямую, он может использовать модули слияния (msm) для распределения необходимых сред выполнения, в противном случае довольно просто запустить msi из установщика. Вы также можете написать свой собственный установщик, но вы получите другое приложение для написания, тестирования и сопровождения. Я бы воспользовался существующими для такой задачи.

Другие вопросы по тегам