我需要支持一个旧版应用程序,它最初是为 Windows NT 4(32 位)创建的,但在 Windows 10(64 位)下仍能正常运行,前提是完成所有兼容性设置。问题是这些设置大部分都必须手动完成。
我正在尝试弄清楚如何构建一个可以为此目的提供的程序或脚本。我已经知道兼容性设置分别存储在HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
或下的注册表中HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
(取决于设置是应用于所有用户还是仅应用于单个用户),通过添加名称为应用程序路径的值,例如
C:\Program Files (x86)\SomeApp\SomeBinary.exe
添加以下内容(为了兼容 Windows XP Service Pack 3)
WINXPSP3
就像在 Windows 7 上观察到的那样,或者
~ WINXPSP3
就像在 Windows 8.1(和 Windows 8)上观察到的那样
在运送这样的工具之前我想了解的是:
开始值内容的波浪符号的用途或含义是什么?
我搜索了几个月(谷歌、必应),但现在,我除了疑问什么也没找到。我只能猜测,它也可能是无意义的(?):
当通过“属性”设置兼容模式时,Windows 会在值前放置一个波浪符号 (~),后面跟着一个空格,例如“~ WINXPSP3”。但无论波浪符号是什么,它似乎都可以工作(或根据情况无法工作)。
但关于调整兼容性设置的大多数建议似乎都十分关注这个神奇的字符:
有谁真正了解它吗?
答案1
我正在研究同样的事情并发现了这一点(重点是我的):
如果值包含序列波浪符号 [~],则该值将被解释为 Null 分隔的字符串列表 (REG_MULTI_SZ)。例如,要指定包含三个字符串 a、b 和 c 的列表,请使用“a[~]b[~]c”。
值内的序列 [~] 分隔各个字符串,并被解释和存储为空字符。
如果字符串列表前面有 [~],则该字符串将被附加到任何现有的注册表值字符串。如果附加字符串已出现在注册表值中,则删除该字符串的原始出现。
如果字符串列表末尾有 [~],则该字符串将被添加到任何现有注册表值字符串的前面。如果注册表值中已经出现前置字符串,则删除该字符串的原始出现。
如果 [~] 同时位于字符串列表的开头和结尾,或者既不在开头也不在结尾,则字符串将替换任何现有的注册表值字符串。
否则,该值将被解释并存储为字符串 (REG_SZ)。
来源:本文注册表 (Windows)安装程序数据库参考
因此看起来波浪号只是附加或添加字符串值。