Come scegliere l'architettura del processore di installare un MSI con Delphi
-
27-09-2019 - |
Domanda
Buone notizie: Una versione principale è nella borsa
Brutte notizie: Ho appena scoperto (2 settimane troppo tardi) che alcune persone non hanno MSXML 6 sulle loro macchine e il nuovo programma di installazione stiamo implementando lo richiede.
Buone notizie: Possiamo distribuire un file MSI per installare MSXML
Cattive notizie: Ci sono tre file MSI da scegliere, un 'normale' uno, uno che termina in ia64 e uno che termina in x64.
ho a mia disposizione, Delphi 7, C ++ e um ... I file batch ... Come faccio a fare una di quelle a portata di mano Setup.exe di che scegliere il giusto MSI per avviare automaticamente.
Soluzione
Risposta breve: Utilizzare il GetSystemInfo
la funzione delle API di Windows per scoprire se il sistema è a 32-bit o 64-bit.
Esempio di codice:
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.
Le due uscite più comuni sono 'Intel' (32 bit x 86) e 'AMD64' (64-bit x64). In realtà, si può più o meno la fiducia che si ottiene uno di quelli.
Ora, in realtà, credo che il programma di cui sopra sarà sempre di ritorno 'Intel' (32-bit x86) perché tutte le applicazioni Delphi sono a 32-bit, e quindi sono emulati sotto un 64 bit di Windows (tramite WOW64) -. non v'è alcun rilascio a 64-bit del compilatore Delphi e IDE
Quindi, per ottenere il true architettura del sistema, a prescindere di emulazione, è necessario utilizzare il GetNativeSystemInfo
funzione. Non v'è alcun wrapper per questa funzione, quindi bisogna importarlo se stessi da 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.
Altri suggerimenti
Si può dimenticare l'IA64, che è per i sistemi Itanium. Userei uno strumento per creare un setup (ci sono quelli gratuiti eccellenti, come InnoSetup). Saranno rilevare quale tipo di sistema di setup è in funzione fino al momento, e lasciare che si esegue la corretta installazione di MSXML. Se lo strumento supporta il motore di Windows Installer direttamente è possibile usufruire di moduli di unione (MSM) per distribuire i tempi di esecuzione necessari, altrimenti è abbastanza facile da eseguire un msi dal programma di installazione. Si potrebbe anche scrivere il proprio installatore, ma si ottiene un'altra applicazione di scrivere, testare e mantenere. Mi piacerebbe prendere vantaggio di quelle esistenti per tale compito a.