好消息:主要版本已经发布了!
坏消息:我刚刚发现(2周太晚了)有些人在他们的机器上没有MSXML 6,而我们推出的新安装程序需要它。
好消息:我们可以分发MSI文件来安装MSXML
坏消息:有三个MSI文件可供选择,一个是'普通'文件,一个以ia64结尾,一个以x64结尾。
我可以随意使用Delphi 7,C ++和嗯...批处理文件...如何制作其中一个方便的Setup.exe,选择正确的MSI自动启动。
答案 0 :(得分:2)
简答:使用Windows API的GetSystemInfo
功能查明系统是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下模拟的-bit Windows(使用WOW64) - 没有64位版本的Delphi编译器和IDE。
因此,要获得系统的 true 架构,无论是否进行仿真,都必须使用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.
答案 1 :(得分:1)
您可以忘记用于Itanium系统的IA64。 我会使用一个工具来创建一个设置(有很好的免费设置,比如InnoSetup)。他们将检测正在运行的设置类型,并让您运行正确的msxml安装程序。如果该工具直接支持Windows Installer引擎,它可以利用合并模块(msm)来分发所需的运行时,否则很容易从安装程序运行msi。 您也可以编写自己的安装程序,但是您可以使用另一个应用程序来编写,测试和保护。我会利用现有的优势来完成这项任务。