【问题标题】:Why MSI Patching a TTF font file always cause a reboot?为什么 MSI 修补 TTF 字体文件总是会导致重新启动?
【发布时间】:2015-08-23 02:40:43
【问题描述】:

我们创建了一个更新 TrueType 字体 (.TTF) 文件的 MSP 补丁,但它会导致 1603(安装后需要重新启动。) 这是 MSI 日志:

MSI (s) (5C:48) [23:33:56:432]: Executing op: FileCopy(SourceName=TestFont.ttf,SourceCabKey=testfont.ttf,DestName=TestFont.ttf,Attributes=20480,FileSize=34880,PerTick=65536,,VerifyMedia=1,,,,,CheckCRC=0,Version=1.3.0.0,,InstallMode=58982400,HashOptions=0,HashPart1=1022639218,HashPart2=1170530421,HashPart3=1359995143,HashPart4=-948212544,,)
MSI (s) (5C:48) [23:33:56:432]: File: C:\Program Files (x86)\TESTDIR\TestFont.ttf;  Overwrite;  Won't patch;    Existing file is a lower version
MSI (s) (5C:48) [23:33:56:433]: Source for file 'passtrue.ttf' is compressed
InstallFiles: File: TestFont.ttf,  Directory: C:\Program Files (x86)\TESTDIR\,  Size: 34880
MSI (s) (5C:48) [23:33:56:434]: Re-applying security from existing file.
Info 1603. The file C:\Program Files (x86)\TESTDIR\TestFont.ttf is being held in use.  Close that application and retry.
MSI (s) (5C:48) [23:33:57:765]: Verifying accessibility of file: TestFont.ttf

我确定该文件未在使用中。 (在应用此补丁之前重新启动机器。)

谢谢!

【问题讨论】:

  • 什么都没有想到。假设您是对的,您可能需要向 Microsoft 提出支持案例。
  • @ChristopherPainter:实际上,如果字体安装在相关注册表项中但文件不在系统字体文件夹中,这是预期的行为(从 MS14-045 开始)。
  • 很高兴知道。如果 MSFT 在某个地方的 MSI SDK doco 中记录了该内容,而不必知道它是一些底层 GDI 行为在过去一年中随着某个修补程序而改变,那应该会很好。我已经做了 20 年的安装程序,但说实话,最近的字体并不多。

标签: windows-installer patch truetype msp


【解决方案1】:

最可能的原因是该字体被安装为永久字体,即它在注册表中列出。相关的注册表项是:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

Font Installation and Deletion中所述:

从 %windir%\fonts 文件夹以外的位置安装的字体在任何活动会话(包括会话 0)中加载时都无法修改。因此,任何更改、替换或删除的尝试都将被阻止。 [...] 永久字体在重新启动后仍然安装,并由所有创建的会话加载。

您可以通过将字体安装在%windir%\fonts 目录中或将其设为临时字体来解决此问题。

(请注意,此行为相对较新,已在 security update MS14-045 中引入。)

【讨论】:

  • 哇,你知识渊博!非常感谢哈利。那么为什么我的字体被安装为永久字体呢?如何在我们的应用程序文件夹中安装时使其成为临时字体?
  • 也许你可以写一个社区版:msdn.microsoft.com/en-us/library/aa368606(v=vs.85).aspx
  • 我对安装程序了解不多,@Christopher 或许可以在这方面提供帮助。但是大概Font table 中命名的所有字体都安装为永久字体,您只需将其排除在此表之外即可使其成为临时字体。当然,您必须修改您的应用程序,以便它在运行时加载字体。
  • 如果他正在创建补丁,那就太晚了。已经部署的 MSI 应该已经包含了它。
  • 谢谢你们!对于补丁,我将添加一个自定义操作来删除 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts 中的那些注册表值,并删除字体表,因此任何更新字体的未来补丁都不会出现重启提示.并且对于下一个版本,它将没有字体表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2011-05-13
  • 2019-11-12
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
相关资源
最近更新 更多