Как выполнить установку условного шрифта в Vista Business с помощью NSI?

#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