Как выбрать архитектуру процессора для установки MSI с Delphi
-
27-09-2019 - |
Вопрос
Хорошие новости: основной релиз в сумке!
Плохие новости: я только что узнал (2 недели слишком поздно), что у некоторых у некоторых у некоторых у некоторых людей MSXML 6 на своих машинах, а новый установщик, который мы выкатываем, требует этого.
Хорошие новости: мы можем распространить файл MSI для установки MSXML
Плохой новости: есть три файла MSI на выбор, один «нормальный» один, один конец в IA64 и один заканчивается в X64.
У меня в моем распоряжении, Delphi 7, C ++ и UM ... Пакетные файлы ... Как сделать один из этих удобных Setup.exe, которые выбирают правильный MSI, чтобы запустить автоматически.
Решение
Краткий ответ: используйте GetSystemInfo
Функция API Windows, чтобы узнать, является ли система 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-битными окнами (используя 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 Systems. Я бы использовал инструмент для создания установки (есть отличные бесплатные, такие как innoSetup). Они обнаружит, какую систему запущена настройка, и позволит вам запустить правильный установщик MSXML. Если инструмент поддерживает двигатель установщика Windows напрямую, он может воспользоваться модулями MERGE (MSM) для распространения необходимых runtimes, в противном случае довольно легко запустить MSI от установщика. Вы также можете написать свой собственный установщик, но вы получите еще одно приложение для записи, тестирования и Mantain. Я бы воспользовался существующими для такой задачи.