要求/用例:
我需要在NSIS中实现自定义许可页面。该页面应如下所示:。
在页面上,我有RichEdit控件,其中显示eula.rtf 文件的内容。此文件在编译时可用,我无法从安装程序中单独分发,因此必须以某种方式嵌入其中。
目前我正在使用NSIS 2.46和MUI2。以下是我创建RichEdit控件的方法:
nsDialogs::CreateControl /NOUNLOAD "RichEdit20A" ${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_STATICEDGE} 1.32u 56.62u 295.54u 63.38u ""
Pop $hCtl_test_rtLicense
问题描述:
我知道默认的MUI2许可页面使用LicenseData and/or LicenseLangString。据我所知,在这种情况下,.rtf文件嵌入到安装程序中。不幸的是我无法弄清楚如何将嵌入式.rtf文件中的内容加载到我的RichEdit控件中,即使我查看了NUI2附带的License.nsh以及NSIS源代码。< / p>
很遗憾我找到的插件和脚本(LoadRtf plugin,NsRichEdit plugin,this script以及一两个)只能加载.rtf在运行时将文件存入RichEdit控件 。
问题:
如何将嵌入的.rtf文件中的内容加载到自定义页面上的RichEdit中?
如果不可能,还有其他方法来实现我的要求吗?
我唯一能想到的就是将我当前的安装程序包装到另一个瘦NSIS安装程序中,该安装程序将静默部署.rtf文件以及当前安装程序。这感觉非常混乱,所以我宁愿不这样做..
答案 0 :(得分:1)
执行此操作的唯一方法是在运行时。要使用您链接到的解决方案之一,只需提取.rtf文件并调用插件:
InitPluginsDir ; Initialize $PluginsDir, it is deleted automatically when installer quits
File "/oname=$PluginsDir\lic.rtf" "MyLicense.rtf"
# Call plugin here passing in "$PluginsDir\lic.rtf" as the file to load
或者,如果您不想使用第三方插件:
Page Custom MyPage
Page InstFiles
!include LogicLib.nsh
!include nsDialogs.nsh
!define SF_RTF 2
!define EM_STREAMIN 1097
Function LoadRichRtf
System::Store S
Pop $0 ; hwnd
Pop $1 ; path to rtf
FileOpen $1 $1 r
System::Get "(i, i .R0, i .R1, i .R2)iss"
Pop $2
System::Call "*(*i 0, i 0, k r2)i.r3"
System::Call "USER32::SendMessage(ir0, i${EM_STREAMIN}, i${SF_RTF}, ir3)i.s"
loop:
Pop $0
StrCmp $0 "callback1" 0 done
System::Call 'KERNEL32::ReadFile(ir1, iR0, iR1, iR2, i0)'
Push 0 # callback's return value
System::Call "$2"
Goto loop
done:
System::Free $2
System::Free $3
FileClose $1
System::Store L
FunctionEnd
Var hCtl_test_rtLicense
Function MyPage
nsDialogs::Create 1018
Pop $0
nsDialogs::CreateControl /NOUNLOAD "RichEdit20A" ${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_STATICEDGE} 1.32u 56.62u 295.54u 63.38u ""
Pop $hCtl_test_rtLicense
File "/oname=$PluginsDir\lic.rtf" "c:\some\local\path\License_en_US.rtf"
Push "$PluginsDir\lic.rtf"
Push $hCtl_test_rtLicense
Call LoadRichRtf
nsDialogs::Show
FunctionEnd