Почему исправление MSI файла шрифта TTF всегда вызывает перезагрузку?

Мы создаем патч 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

Я уверен, что файл не используется. (перезагрузил машину перед применением этого патча.)

Спасибо!


person Rex Hui    schedule 23.08.2015    source источник
comment
Ничего не приходит на ум. Предполагая, что вы правы, вам может потребоваться открыть запрос в службу поддержки Microsoft.   -  person Christopher Painter    schedule 23.08.2015
comment
@ChristopherPainter: на самом деле это ожидаемое поведение (начиная с MS14-045), если шрифт установлен в соответствующем разделе реестра, но файл не находится в папке системных шрифтов.   -  person Harry Johnston    schedule 23.08.2015
comment
Хорошо знать. Было бы неплохо, если бы MSFT задокументировала это где-нибудь в документации MSI SDK, не зная, что это какое-то базовое поведение GDI, которое изменилось с определенным исправлением в прошлом году. Я занимаюсь установщиками уже 20 лет, но в последнее время не так много шрифтов, если честно.   -  person Christopher Painter    schedule 23.08.2015


Ответы (1)


Наиболее вероятная причина в том, что шрифт установлен как постоянный, т. е. указан в реестре. Соответствующий раздел реестра:

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

Как описано в разделе Установка и удаление шрифтов:

Шрифт, установленный из папки, отличной от папки %windir%\fonts, нельзя изменить при загрузке в любом активном сеансе, включая сеанс 0. Поэтому любая попытка изменить, заменить или удалить будет заблокирована. [...] Постоянные шрифты остаются установленными после перезагрузки и загружаются всеми созданными сеансами.

Вы можете решить эту проблему, установив шрифт в каталог %windir%\fonts или сделав его временным шрифтом.

(Обратите внимание, что это поведение появилось относительно недавно, оно было представлено в обновлении безопасности MS14-045.)

person Harry Johnston    schedule 23.08.2015
comment
Вау, ты такой знающий! Большое спасибо, Гарри. Так почему же мой шрифт установлен как постоянный? Как сделать его временным шрифтом, пока он все еще устанавливается в папку нашего приложения? - person Rex Hui; 23.08.2015
comment
Я мало что знаю об установщике, @Christopher может помочь в этом аспекте. Но предположительно все шрифты, указанные в таблице шрифтов устанавливаются как постоянные шрифты, и вы можете сделать их временными, просто исключив их из этой таблицы. Конечно, тогда вам придется изменить свое приложение, чтобы оно загружало шрифт во время выполнения. - person Harry Johnston; 24.08.2015
comment
Если он создает патч, то уже слишком поздно. Уже развернутый MSI уже включил бы его. - person Christopher Painter; 24.08.2015
comment
Спасибо вам обоим! Для патча я добавлю пользовательское действие для удаления этих значений реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts, а также удалю таблицу шрифтов, поэтому любые будущие патчи, которые обновляют шрифты, не будут иметь запрос на перезагрузку . И в следующем выпуске таблицы шрифтов не будет. - person Rex Hui; 24.08.2015