1

Хорошая новость: большой выпуск находится в сумке!Как выбрать архитектуру процессора для установки MSI с Delphi

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

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

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

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

+0

Какой установщик вы пишете? Я уверен, что InnoSetup лучше, чем пакетные. –

+0

Да, я не собирался использовать пакетные файлы, но не планировал, чтобы боссман потратил любой CA двойной SH, для этого, так как это моя ошибка в том, что я начинаю с сумасшедшего кровотечения (и никто больше здесь не использует какой-либо COM-материал) , –

+4

Ну, InnoSetup - это F R double E. Вы должны взглянуть на него. –

ответ

2

Краткий ответ: используйте функцию Windows API GetSystemInfo, чтобы узнать, является ли система 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. 
+0

Кстати: в последнем примере он выглядит вроде блока 'begin ... end' - это реализация' GetNativeSystemInfo'. Это не тот случай. Блок представляет собой консольную программу. В более регулярном блоке вы должны написать 'procedure GetNativeSystemInfo (var lpSystemInfo: TSystemInfo); stdcall; 'в разделе' interface' и 'procedure GetNativeSystemInfo; external kernel32 name 'GetNativeSystemInfo'; 'в разделе' реализация'.Затем, с любого устройства, использующего этот модуль, вы можете вызвать 'GetNativeSystemInfo', так же, как вы называете' GetSystemInfo'. –

+0

Спасибо метрической тон, я буду отмечать это как ответ, как только я запустил ваш код. –

1

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

+0

Точка хорошо взята, хорошо знать, что такое IA64, потому что, если бы я забыл, вы можете сделать ставку, что 7 наших клиентов понадобятся! –

+0

Кроме того, следует упомянуть, что GetNativeSystemInfo не находится в Win2k, но если у них есть win2k, то, надеюсь, у них нет 64-битного процессора, так что эй. Я нашел это также полезным http://msdn.microsoft.com/en-us/library/ms724429%28VS.85%29.aspx –

+0

Хотя, я должен был упомянуть его как комментарий к сообщению другого парня. , –

 Смежные вопросы

  • Нет связанных вопросов^_^