Вы что-то упустили из кода, который вы опубликовали?
Я не тестировал NSIS для установки шрифтов на XP, но приведенный выше код не будет работать для Vista (или, по крайней мере, не будет работать)для Windows 7)
Посмотрите сценарии Register_Fonts и Advanced_Font_Installation .Они должны устанавливать ваши шрифты по мере необходимости.
С помощью этих сценариев ваш код NSIS-скрипта должен выглядеть примерно так (я исключил условную логику, но это должно работать просто отлично):
!include FontRegAdv.nsh
!include FontName.nsh
!define FontBackup Reg\key\To\Backup\Fonts\entries\To
StrCpy $FONT_DIR $FONTS
!insertmacro InstallTTF 'arial.TTF'
SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
SectionEnd
Для своего собственного проекта я использую Unicode-сборку NSIS.Это означает, что я не могу использовать вышеупомянутые сценарии, поэтому вместо этого я использую базовые функции реестра и winapi (что и делают приведенные выше сценарии под обложками).Пример моего кода ниже:
Section InstallFont
SetOutPath "$FONTS"
File "arial.ttf"
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentVersion"
IfErrors Win9x WinNT
Win9x:
StrCpy $FONTREGKEY "Software\Microsoft\Windows\CurrentVersion\Fonts"
Goto RegFont
WinNT:
StrCpy $FONTREGKEY "Software\Microsoft\Windows NT\CurrentVersion\Fonts"
Goto RegFont
RegFont:
ClearErrors
System::Call "gdi32::AddFontResource(t 'arial.ttf')"
Push 'arial.ttf'
Call GetFontName
Pop $R0
${If} $R0 != 'error'
WriteRegStr HKLM '$FONTREGKEY' '$R0 (TrueType)' 'arial.ttf'
${Else}
System::Call "gdi32::RemoveFontResource(t 'arial.ttf')"
${EndIf}
SectionEnd
Function GetFontName
Exch $R0
Push $R1
Push $R2
System::Call *(i${NSIS_MAX_STRLEN})i.R1
System::Alloc ${NSIS_MAX_STRLEN}
Pop $R2
System::Call gdi32::GetFontResourceInfoW(wR0,iR1,iR2,i1)i.R0
${If} $R0 == 0
StrCpy $R0 error
${Else}
System::Call *$R2(&w${NSIS_MAX_STRLEN}.R0)
${EndIf}
System::Free $R1
System::Free $R2
Pop $R2
Pop $R1
Exch $R0
FunctionEnd