1

好消息:一个重大版本即将发布!

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

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

坏消息:有三个 MSI 文件可供选择,一个“普通”文件,一个以 ia64 结尾,一个以 x64 结尾。

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

4

2 回答 2

2

简短回答:使用GetSystemInfoWindows 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.
于 2010-08-10T13:50:08.633 回答
1

您可以忘记用于安腾系统的 IA64。我会使用一个工具来创建一个设置(有很好的免费工具,比如 InnoSetup)。他们将检测安装程序在哪种系统上运行,并让您运行正确的 msxml 安装程序。如果该工具直接支持 Windows Installer 引擎,它可以利用合并模块 (msm) 来分发所需的运行时,否则很容易从安装程序运行 msi。您也可以编写自己的安装程序,但您会得到另一个应用程序来编写、测试和维护。我会利用现有的来完成这样的任务。

于 2010-08-10T15:21:07.517 回答