最新消息:

反编译 NSIS 的脚本(三)

nsis 永恒心锁 1574浏览 0评论

8. 组件的隐藏和显示
细心的朋友都看到了脚本里面有两个 !insertmacro MUI_PAGE_COMPONENTS,那么组件选择页面就会出现两次,察看 gaydata.ini 就知道第一次显示的是 sec0 到 sec36,第二次显示的是 sec37 到 sec 47。
关于页面的说明请看这里

每个页面都有三个函数: Pre、Show、Leave,分别是预载入、显示、离开,在 MUI 界面可以用定义的方法来插入函数,比如在 !insertmacro MUI_PAGE_COMPONENTS 前(插入上一个页面之后) 定义一个 MUI_PAGE_CUSTOMFUNCTION_PRE 函数就可以插入一个预载入函数。在本次脚本中在第一个组件选择页面作如下定义

 !define MUI_PAGE_CUSTOMFUNCTION_PRE ComponentPre
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW ComponentShow

上面定义了 ComponentPre、ComponentShow 函数,当然定义的函数名可以随便起,但一般来说名字都要表达它的含义,便于阅读。

在开始创建这两个函数之前还要定义一些内容

 !define SECTION_COMPONENT_END 36
 !define SECTION_ASSCOIATION_START 37
 !define SECTION_TOTAL 47

上面定义了 36 是要安装的组件最后的区段索引好,37 是文件关联等的开始区段索引号,47 是总共的区段数。ComponentPre 函数的内容如下

 Function ComponentPre
 Push $0
 Push $1
 Call SectionTextReset
 StrCpy $1 0
 loop:
 ReadINIStr $0 "$PLUGINSDIR\gaydata.ini" "secnames" "sec$1"
 StrCmp $0 "" 0 +2
 SectionSetText $1 ""
 StrCmp $1 ${SECTION_COMPONENT_END} loop_quit
 IntOp $1 $1 + 1
 Goto loop
 loop_quit:
 StrCpy $1 ${SECTION_ASSCOIATION_START}
 SectionSetText $1 ""
 StrCmp $1 ${SECTION_TOTAL} +3
 IntOp $1 $1 + 1
 Goto -3
 Pop $1
 Pop $0
 FunctionEnd

这个函数调用了 SectionTextReset 函数,SectionTextReset 函数如下

 Function SectionTextReset
 Push $R0
 StrCpy $R0 0
 SectionSetText $R0 " "
 StrCmp $R0 ${SECTION_TOTAL} +3
 IntOp $R0 $R0 + 1
 Goto -3
 Pop $R0
 FunctionEnd

SectionTextReset 函数构成一个循环,$R0 从 0 开始递增,直到等于 ${SECTION_TOTAL} 后跳出循环,这个循环把所有区段的名称都重置为空格,在两个 MUI_PAGE_COMPONENTS 页面的预载入函数都调用一次。这是因为 Show 函数会把一些区段隐藏,即把区段名称设为空值,在下一个 MUI_PAGE_COMPONENTS 页面的 Pre 阶段必须给它一个名称,否则它将一直隐藏。

免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。丨本站为个人博客非盈利性站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途。丨本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权BY-NC-SA协议进行授权

转载请注明:永恒心锁-分享互联网 » 反编译 NSIS 的脚本(三)

您必须 登录 才能发表评论!