Comment choisir l'architecture de processeur pour installer un MSI avec Delphi
-
27-09-2019 - |
Question
Bonnes nouvelles: Une version majeure est dans le sac
Les mauvaises nouvelles: Je viens de découvrir (2 semaines trop tard) que certaines personnes ne sont pas MSXML 6 sur leurs machines et le nouvel installateur nous déroulons l'exige.
Bonnes nouvelles: Nous pouvons distribuer un fichier MSI pour installer MSXML
Les mauvaises nouvelles: Il y a trois fichiers MSI à choisir, un « normal » un, se terminant par un ia64 et se terminant en un x64.
J'ai à ma disposition, Delphi 7, C ++ et euh ... les fichiers de traitement par lots ... Comment puis-je faire un de ceux qui choisissent de Setup.exe pratique le droit MSI pour lancer automatiquement.
La solution
Réponse courte: Utilisez le GetSystemInfo
fonction de l'API Windows pour savoir si le système est 32 bits ou 64 bits.
Exemple de code:
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.
Les deux sorties les plus courantes sont 'Intel' (32-bit x86) et 'AMD64' (x64 64 bits). En fait, vous pouvez plus ou moins confiance que vous obtiendrez un.
Maintenant, en réalité, je crois que le programme ci-dessus va toujours retour « Intel » (x86 32 bits), car toutes les applications Delphi sont 32 bits, et donc ils sont émulées sous 64 Fenêtres -bit (en utilisant WOW64) -. il n'y a pas version 64 bits du compilateur Delphi et IDE
Donc, pour obtenir le true architecture du système, quel que soit l'émulation, vous devez utiliser le GetNativeSystemInfo
de fonction. Il n'y a pas wrapper pour cette fonction, vous devez importer vous de 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.
Autres conseils
Vous pouvez oublier l'IA64 qui est pour les systèmes Itanium. J'utiliser un outil pour créer une configuration (il y a excellents libres, comme InnoSetup). Ils détecteront quel type de système la mise en configuration est en cours d'exécution sur, et vous permettre d'exécuter le bon programme d'installation de MSXML. Si l'outil prend en charge le moteur Windows Installer directement, il peut tirer parti des modules de fusion (de VSM) pour distribuer runtimes nécessaires, sinon est assez facile à exécuter un msi de l'installateur. Vous pouvez également écrire votre propre programme d'installation, mais vous obtenez une autre application pour écrire, tester et mantenir. Je profite de ceux qui existent déjà pour tâche d'un tel.