Windows installer 为什么MSI修补TTF字体文件总是导致重新启动?

Windows installer 为什么MSI修补TTF字体文件总是导致重新启动?,windows-installer,patch,truetype,msp,Windows Installer,Patch,Truetype,Msp,我们创建了一个MSP修补程序,用于更新TrueType字体(.TTF)文件,但它会导致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,,VerifyM

我们创建了一个MSP修补程序,用于更新TrueType字体(.TTF)文件,但它会导致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
我确信这个文件没有被使用。(在应用此修补程序之前重新启动计算机。)


谢谢

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
如中所述:

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

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


(请注意,这种行为是最近才出现的,已经在中介绍过。)

没有想到什么。假设您是对的,您可能需要打开Microsoft的支持案例。@ChristopherPaint:实际上,如果字体安装在相关注册表项中,但文件不在“系统字体”文件夹中,这是预期的行为(从MS14-045开始)。很高兴知道。如果MSFT在MSI SDK doco中的某个地方记录了这一点,而不必知道这是某种潜在的GDI行为在过去的一年中随着某个修补程序的改变,那就太好了。我做安装工已经20年了,但老实说,最近字体不多。哇,你真是太有知识了!非常感谢你,哈利。那么,为什么我的字体是作为永久字体安装的呢?在我们的应用程序文件夹中安装时,如何使它成为一种临时字体?也许你可以写一个社区版:我对安装程序了解不多,@Christopher可能会在这方面提供帮助。但是,假定中命名的所有字体都是作为永久字体安装的,您只需将其从表中删除即可将其设置为临时字体。当然,你必须修改你的应用程序,让它在运行时加载字体。如果他正在创建补丁,那就太晚了。已经部署的MSI应该已经包含了它。谢谢你们!对于修补程序,我将添加一个自定义操作,以删除HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts中的注册表值,并删除字体表,以便将来更新字体的修补程序不会出现重新启动提示。对于下一个版本,它将没有字体表。