0. 背景概要
最近在解决一个安装程序在安装过程中检测是否已经安装并且获取安装版本的问题,问题的根源就是关于Windows系统是32位还是64位以及程序是32位还是64位。
function GetInstalledVerion(out uninstaller: String): String;
var
oldVersion: String;
key : String;
appGuid : String;
begin
appGuid := '{#emit SetupSetting("AppId")}';
Delete(appGuid,1,1);
oldVersion := '';
if IsWin64 then
begin
key := 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\' + appGuid + '_is1';
end
else
begin
key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + appGuid +'_is1';
end;
if RegKeyExists(HKEY_LOCAL_MACHINE,key)
then
begin
RegQueryStringValue(HKEY_LOCAL_MACHINE, key,'DisplayVersion', oldVersion);
RegQueryStringValue(HKEY_LOCAL_MACHINE, key, 'UninstallString', uninstaller);
end
else
begin
if RegKeyExists(HKEY_CURRENT_USER,key)
then
begin
RegQueryStringValue(HKEY_CURRENT_USER, key,'DisplayVersion', oldVersion);
RegQueryStringValue(HKEY_CURRENT_USER, key, 'UninstallString', uninstaller);
end;
end;
Result := oldVersion;
end;
1. Windows系统简介
1.1 系统发展
随着计算机技术的不断发展,Windows操作系统也经历了从32位到64位的重大转变。最初,Windows 95的推出标志着从16位到32位的过渡,为更强大的计算能力铺平了道路。随着时间的推移,Windows XP成为首个广泛采用的32位操作系统,为用户带来了更稳定的体验。
进入21世纪初,Windows迈出了迈向64位计算的一步。Windows XP 64位版和Server 2003首次引入了64位支持,为更大内存容量和更高性能的需求做好了准备。
随后,Windows 7成为64位时代的巅峰代表,成功地推动用户从32位向64位平台过渡。Windows 10继续这一趋势,作为通用平台操作系统,支持各种设备,并默认提供64位版本。
现今,Windows 11继续引领着64位操作系统的发展,注重性能和用户体验。64位系统已经成为主流,为现代计算需求提供更大的灵活性和性能优势。
1.2 系统分类
我们所说的32位和64位是指计算机中处理器的寻址能力和数据处理能力的位数。
- 32位: 表示处理器可以同时处理32位的数据。在32位系统中,寻址能力为2^32(大约4GB)。
- 64位: 表示处理器可以同时处理64位的数据。在64位系统中,寻址能力为2^64,远远超过32位系统,允许处理更大的内存和更复杂的数据。
所以目前主流的Windows系统分为 32位 和 64位 两种。需要注意的是:
- 使用64位指令集开发的程序是专门运行在64位的系统上,不支持32位的操作系统。
- 使用32位指令集开发的程序可运行在32位和64位的操作系统上
1.3 Windows目录介绍
在Windows操作系统中,C盘是系统分区,包含了操作系统及其相关文件。以下是C盘主要目录的一些常见内容:
- Windows: 这个目录包含了操作系统的核心文件,包括系统文件、驱动程序、系统库和其他与操作系统运行相关的文件。通常,这是C盘最大的一个目录。
- Program Files: 在这个目录下,安装的应用程序的文件将被存储。每个应用程序通常都有一个单独的子目录,以便于组织和管理。
- Program Files (x86): 这是用于存储64位系统上运行的32位应用程序的目录。64位系统下的32位应用程序通常会被安装到这个目录。
- Users: 用户个人文件和设置存储在这个目录下,每个用户有一个单独的子目录。例如,用户文档、下载、桌面和个人设置文件等通常存储在这里。
- Windows\System32: 包含系统的核心系统文件和系统工具。虽然名为System32,但在64位系统上,它包含64位和32位系统文件。这个目录中的文件对系统的正常运行至关重要。
- Temp: 用于存放临时文件的目录。这些文件通常由系统或应用程序在运行时生成,但它们可以在系统不再需要它们时被删除。
- AppData: 包含应用程序的数据和设置文件。每个用户都有一个AppData目录,其中包括Local、Roaming和LocalLow等子目录,用于存储不同类型的应用程序数据。
- Windows.old: 当进行操作系统升级时,旧版本的Windows文件会被移动到这个目录。它允许用户在升级后一段时间内恢复到旧版本的Windows。
- $Recycle.Bin: 存放回收站中删除的文件的目录。每个用户都有一个对应的Recycle Bin目录。
2. 程序安装
在安装程序时我们遇到过类似下面的弹窗:
这里有两种安装模式:
- 仅为当前用户安装: 不需要管理员权限,一般默认安装在
%localappdata%\Programs
- 为所有用户安装: 需要管理员权限,一般安装在C盘 Program Files或者Program Files (x86)
程序安装后一般会在注册表写入安装信息,不同位数的程序安装到不同位数的系统写入的注册表位置不同。
2.1 仅为当前用户安装
一般情况下,32位程序安装到32位系统, 64位程序安装到64位系统,如果只是给当前用户安装,那么程序的安装卸载信息都在注册表的:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
在64位系统安装32位的程序时, 如果是仅为当前用户安装,经测试在Win7 Win10 Win11 上其安装卸载信息和上面的一致在:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
2.2 为所有用户安装
一般情况下,32位程序安装到32位系统, 64位程序安装到64位系统,为所有用户安装,那么程序的安装卸载信息都在注册表的:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
在64位系统安装32位的程序时, 为所有用户安装,其安装卸载信息则在:
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
3. 总结
综上所述:
- 仅为当前用户安装: 注册表位置
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
- 为所有用户安装匹配位数的程序: 注册表位置
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
- 64位系统为所有用户安装32位程序: 注册表位置
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
如果需要自己验证,可以使用Inno Setup的示例程序打包安装验证,需要注意的是如果打包64位安装程序需要在[Setup] 区段添加:
[Setup]
; 指定支持的位数
;ArchitecturesInstallIn64BitMode=x64
如果你觉得本文有帮助,请点击在看分享给更多的人。
关注我获取更多文章以及实用工具和美图~