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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top