#nsis
#nsis
Вопрос:
я использую NSI для настройки своего приложения. Мне нужно выполнить условную установку файлов шрифтов. Я пытался использовать следующий фрагмент скрипта (для arial и verdana):-
IfFileExists "$FONTSarial.ttf" Continue InstallFont
InstallFont:
SetOutPath "$FONTS"
File "arial.ttf"
Continue:
# Continue in installation...
Это работает в MS XP (как для arial, так и для verdana), но не в моей MS Vista Business (я удалил verdana из папки fonts перед запуском установки). Но некоторые шрифты не устанавливаются в Vista. Пожалуйста, помогите!!.
Ответ №1:
Вам чего-нибудь не хватает в опубликованном вами коде?
Я не тестировал NSI для установки шрифтов в XP, но приведенный выше код не будет работать для Vista (или, по крайней мере, не будет работать для Windows 7)
Взгляните на скрипты Register_Fonts и Advanced_Font_Installation. Они должны установить ваши шрифты по мере необходимости.
Используя эти сценарии, ваш скрипт code NSIS должен выглядеть примерно так (я опустил условную логику, но это должно работать просто отлично):
!include FontRegAdv.nsh
!include FontName.nsh
!define FontBackup RegkeyToBackupFontsentriesTo
StrCpy $FONT_DIR $FONTS
!insertmacro InstallTTF 'arial.TTF'
SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
SectionEnd
Для моего собственного проекта я использую сборку NSIS в формате Unicode. Это означает, что я не могу использовать вышеуказанные сценарии, поэтому вместо этого я использую базовые функции реестра и winapi (что и делают приведенные выше сценарии под прикрытием). Пример моего кода приведен ниже:
Section InstallFont
SetOutPath "$FONTS"
File "arial.ttf"
ReadRegStr $0 HKLM "SOFTWAREMicrosoftWindows NTCurrentVersion" "CurrentVersion"
IfErrors Win9x WinNT
Win9x:
StrCpy $FONTREGKEY "SoftwareMicrosoftWindowsCurrentVersionFonts"
Goto RegFont
WinNT:
StrCpy $FONTREGKEY "SoftwareMicrosoftWindows NTCurrentVersionFonts"
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(amp;w${NSIS_MAX_STRLEN}.R0)
${EndIf}
System::Free $R1
System::Free $R2
Pop $R2
Pop $R1
Exch $R0
FunctionEnd