好消息:重大版本已收入囊中!

坏消息:我刚刚发现(晚了 2 周)有些人的计算机上没有 MSXML 6,而我们推出的新安装程序需要它。

好消息:我们可以分发 MSI 文件来安装 MSXML

坏消息:共有三种 MSI 文件可供选择,一种是“正常”文件,一种以 ia64 结尾,一种以 x64 结尾。

我可以使用 Delphi 7、C++ 和嗯...批处理文件...如何制作一个方便的 Setup.exe 来选择正确的 MSI 自动启动。

有帮助吗?

解决方案

简短回答:使用 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)——Delphi 编译器和 IDE 没有 64 位版本。

所以要得到 真的 系统的架构,无论仿真如何,您都必须使用 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其是用于Itanium系统。 我会使用一个工具来创建一个安装(有优秀的免费的,如InnoSetup)。他们将检测哪种系统的建立起来是在运行,并且让你运行MSXML的正确安装程序。如果该工具支持Windows Installer引擎直接可以利用的合并模块(MSM)来分发所需的运行时间,否则是很容易从运行安装一个MSI。 你也可以写自己的安装程序,但你得到另一个应用程序编写,测试和十个分量。我认为这样一个任务,现有的优势。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top