2011-06-03 20 views
1

我爲我的應用程序安裝使用NSIS。我需要執行字體文件的條件安裝。我使用下面的一段腳本(Arial字體和Verdana)嘗試: -如何使用NSIS在Vista Business上執行條件字體安裝?

IfFileExists "$FONTS\arial.ttf" Continue InstallFont 

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

Continue: 
    # Continue in installation... 

這適用於MS XP(無論是Arial和宋體),但不會對我的MS Vista商業版(我刪除了宋體從運行我的安裝之前的字體文件夾)。但是一些字體沒有在Vista上安裝。請幫忙!!。

回答

0

您是否遺漏了您發佈的任何代碼?

我沒有測試過NSIS對XP安裝字體,但你有上面的代碼不會爲Vista的工作(或者至少,對於Windows 7將無法正常工作)

看一看在Register_FontsAdvanced_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