Как выбрать архитектуру процессора для установки 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 из установщика. Вы также можете написать свой собственный установщик, но вы получите другое приложение для написания, тестирования и сопровождения. Я бы воспользовался существующими для такой задачи.