Как выполнить установку условных шрифтов в Vista Business с помощью NSIS? - PullRequest
1 голос
/ 03 июня 2011

Я использую NSIS для настройки моего приложения. Мне нужно выполнить условную установку файлов шрифтов. Я попытался использовать следующий фрагмент сценария (для arial и verdana): -

IfFileExists "$FONTS\arial.ttf" Continue InstallFont

InstallFont:
  SetOutPath "$FONTS"
  File "arial.ttf"

Continue:
  # Continue in installation...

Это работает в MS XP (как для arial, так и для verdana), но не для моей MS Vista Business (я удалил verdana из папки fonts перед запуском установки). Но кое-как шрифты не устанавливаются в Vista. Пожалуйста, помогите !!.

1 Ответ

0 голосов
/ 03 июня 2011

Вы что-то упустили из кода, который вы опубликовали?

Я не тестировал 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
...