将嵌入文件的内容加载到自定义许可页面上的RichEdit控件中

时间:2015-12-04 19:02:25

标签: nsis

要求/用例:
我需要在NSIS中实现自定义许可页面。该页面应如下所示:custom license page 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 pluginNsRichEdit pluginthis script以及一两个)只能加载.rtf在运行时将文件存入RichEdit控件

问题:
如何将嵌入的.rtf文件中的内容加载到自定义页面上的RichEdit中? 如果不可能,还有其他方法来实现我的要求吗?

我唯一能想到的就是将我当前的安装程序包装到另一个瘦NSIS安装程序中,该安装程序将静默部署.rtf文件以及当前安装程序。这感觉非常混乱,所以我宁愿不这样做..

1 个答案:

答案 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