好消息:一个重大版本即将发布!
坏消息:我刚刚发现(太晚了 2 周)有些人的机器上没有 MSXML 6,而我们推出的新安装程序需要它。
好消息:我们可以分发一个 MSI 文件来安装 MSXML
坏消息:有三个 MSI 文件可供选择,一个“普通”文件,一个以 ia64 结尾,一个以 x64 结尾。
我可以使用 Delphi 7、C++ 和嗯...批处理文件...我如何制作那些选择正确的 MSI 以自动启动的方便的 Setup.exe 之一。
好消息:一个重大版本即将发布!
坏消息:我刚刚发现(太晚了 2 周)有些人的机器上没有 MSXML 6,而我们推出的新安装程序需要它。
好消息:我们可以分发一个 MSI 文件来安装 MSXML
坏消息:有三个 MSI 文件可供选择,一个“普通”文件,一个以 ia64 结尾,一个以 x64 结尾。
我可以使用 Delphi 7、C++ 和嗯...批处理文件...我如何制作那些选择正确的 MSI 以自动启动的方便的 Setup.exe 之一。
简短回答:使用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.
两个最常见的输出是“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.
您可以忘记用于安腾系统的 IA64。我会使用一个工具来创建一个设置(有很好的免费工具,比如 InnoSetup)。他们将检测安装程序在哪种系统上运行,并让您运行正确的 msxml 安装程序。如果该工具直接支持 Windows Installer 引擎,它可以利用合并模块 (msm) 来分发所需的运行时,否则很容易从安装程序运行 msi。您也可以编写自己的安装程序,但您会得到另一个应用程序来编写、测试和维护。我会利用现有的来完成这样的任务。