【发布时间】:2020-02-23 01:17:08
【问题描述】:
我有一些旧代码使用 Microsoft Word VBA System.PrivateProfileString 来读取 Windows 注册表中的 DWORD 条目。过去,它会为 String 和 DWORD 注册表项返回正确的值。现在,在 Office 365 更新到版本 1910 后,当读取 DWORD 值时,它会插入一个前导字符(可能是“空”或一些“随机”字符),这当然会导致以下代码中的注册表项验证失败。
这是一个示例
key = System.PrivateProfileString("", "HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft Outlook", "MSIInstallOnWTS")
MsgBox key
结果可能类似于 (squarebox) []1 或 g541
我将 Office 365/Word 2016 降级到版本 1909 build 12130.20272,结果符合预期。它有效。
重写代码以直接使用 Win API 而不是内置的 Word System.PrivateProfileString 函数是解决方案,但我想避免重写代码和部署。
这是一个错误,还是我必须重新编写所有使用 System.PrivateProfileString 的代码?
更新:经过进一步调查,第一个字符不是随机的。它是注册表中 DWORD 值的 ASCII 字符。因此,如果您的 DWORD 值为 1,您会看到一个方框和一个 1。如果您的 DWORD 值为十进制 65(41 十六进制),您将看到 A65,而 97(x61)的 DWORD 返回值为 a97。如果值 > 255 则从 ascii 65 (A) 开始
Microsoft Word click2run 版本 1910(内部版本 12130.20410)也有这个问题。
【问题讨论】:
-
FWIW 我在这里看到了同样的情况,但在 Windows 10 1903 中。我猜这是 Microsoft 的 Windows 或 Office 代码中的某个错误。在这里,我没有可能妨碍您的软件,例如 3rd 方病毒检查器,但我没有排除所有可能的插件。可能值得通过 Word 的笑脸机制进行报告,但我不希望得到回应。
-
问题不清楚:是否总是相同的字符code?或者是否存在可辨别的模式,具体取决于从注册表项返回的值?
-
我使用的 Windows 10 的版本是 1903,但版本 1909 的结果相同。我使用的 Word 版本是 1910 Build 12130.20344。我已使用 Word 中的反馈向 Microsoft 报告。如果返回值为 0,则没有前导字符。如果返回值为 1,则前导字符为方形字符。如果返回值是其他数字,则前导字符是其他值。