您是否遺漏了您發佈的任何代碼?
我沒有測試過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