DelphiでMSIをインストールするためにプロセッサアーキテクチャを選択する方法
-
27-09-2019 - |
質問
良いニュース:主要なリリースがバッグに入っています!
悪いニュース:私はちょうど(2週間遅すぎる)マシンにMSXML 6を持っていない人もいれば、私たちが展開している新しいインストーラーにはそれが必要であることがわかりました。
良いニュース:MSIファイルを配布してMSXMLをインストールできます
悪いニュース:3つのMSIファイルから選択できます。1つは「通常」のファイル、1つはIA64で終わり、もう1つはX64で終わります。
Delphi 7、C ++、およびUM ...バッチファイル...自動的に起動する適切なMSIを選択する便利なセットアップの1つを作成するにはどうすればよいですか。
解決
短い答え:使用してください GetSystemInfo
Windows APIの関数システムが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.
最も一般的な2つの出力は、「Intel」(32ビットx86)と「AMD64」(64ビットx64)です。実際、あなたはそれらの1つを手に入れることを多少信頼することができます。
今、実際には、上記のプログラムは いつも すべてのDelphiアプリケーションが32ビットであるため、64ビットウィンドウ(WOW64を使用)の下でエミュレートされているため、「Intel」(32ビットx86)を返します。
したがって、を取得するために 本当です システムのアーキテクチャは、エミュレーションに関係なく、 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を忘れることができます。ツールを使用してセットアップを作成します(InnoSetupのような優れた無料のツールがあります)。セットアップが実行されているシステムの種類を検出し、MSXMLの適切なインストーラーを実行できます。ツールがWindowsインストーラーエンジンを直接サポートしている場合、マージモジュール(MSM)を利用して必要なランタイムを配布できます。そうでなければ、インストーラーからMSIを実行するのは非常に簡単です。自分のインストーラーを書くこともできますが、別のアプリを書き込み、テストし、Mantainを入手できます。私はそのようなタスクのために既存のものを利用します。