使用 NSIS 注销字体

Deregistering a font with NSIS

当我尝试卸载这样的字体时...

Section "un.Uninstall"
    StrCpy $FONT_DIR $FONTS
    !insertmacro RemoveTTFFont "$FONTS\Vani.ttf"
    !insertmacro RemoveTTFFont "$FONTS\Vanib.ttf"
    SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
SectionEnd

我收到以下错误消息:

Error in macro GetFileNameCall on macroline 2
Error in macro RemoveTTFFont on macroline 9
(...) aborting process

换句话说,FontReg.nsh 文件中的以下部分有问题:

!ifmacrondef GetFileNameCall
   !macro GetFileNameCall _PATHSTRING _RESULT
        Push `${_PATHSTRING}`
        Call GetFileName
        Pop ${_RESULT}
   !macroend
!endif

!ifndef GetFileName
   !define GetFileName `!insertmacro GetFileNameCall`    
    Function GetFileName
        Exch [=12=]
        Push 
        Push     
        StrCpy  [=12=] 1 -1
        StrCmp  '\' 0 +3
        StrCpy [=12=] [=12=] -1
        goto -3    
        StrCpy  0
        IntOp   - 1
        StrCpy  [=12=] 1 
        StrCmp  '' end
        StrCmp  '\' 0 -3
        IntOp   + 1
        StrCpy [=12=] [=12=] ''     
        end:
        Pop 
        Pop 
        Exch [=12=]
    FunctionEnd
!endif

如果有人不能告诉我如何修复该错误,至少可以指出正确的方向吗? 这对社区很有用,因为很多人都遇到过这个问题,但还没有人解决它,就像这里一样 - http://forums.winamp.com/showthread.php?t=245701

不幸的是,我没有收到任何答案,但我必须分享我想出的解决方案,因为我看到很多人都有同样的问题。

删除字体的宏中存在错误,即 "RemoveTTF"、"RemoveTTFFont" 和以下文件中发音相似的字体:FontReg.nsh、FontRegAdv.nsh。它们都使用导致错误的名为 "GetFileNameCall" 的相同函数。这个函数的问题是它将"FontName"和"FontFileName"视为同一个项目!事实上,字体文件名与字体名称不同。我通过从 FontRegAdv.nsh 复制所需的代码并将 FontFileName 和 FontName 变量替换为实际的字体文件名和字体名称来解决这个问题。