Как выбрать архитектуру процессора для установки MSI с Delphi - PullRequest
1 голос
/ 10 августа 2010

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 10 августа 2010

Краткий ответ: используйте функцию 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-битные, и поэтому они эмулируются под 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.
1 голос
/ 10 августа 2010

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

...