设为首页 |收藏本站 |切换到宽版
 找回密码

NSIS中文论坛

查看: 1009|回复: 7
收起左侧

[源码] NSIS制作单文件

[复制链接]
  • TA的每日心情
    慵懒
    2016-12-20 21:05
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    14

    主题

    56

    帖子

    688

    积分

    积分
    688
    发表于 2020-3-9 22:27:53 | 显示全部楼层 |阅读模式
    本帖最后由 Nanlon 于 2020-5-23 16:24 编辑

    一个NSIS制作单文件的示例:
    2020-05-23更新
    这本来是以前写的一个单文件脚本,分享出来仅为示例脚本结构和运行逻辑,没有提供源文件。脚本很简单,但感觉那时写的还是不太完善,现更新一下!
    1. # Include
    2. !include x64.nsh

    3. # APP
    4. !define APPNAME "BCompare"
    5. !define APP_VER "4.3.3.24545"
    6. !define APP_PUB "Scooter Software"
    7. !define DIR_TMP "BCompare-64bit43324545"

    8. # VER
    9. VIProductVersion "${APP_VER}"
    10. VIAddVersionKey /LANG=2052 "ProductName"     "Beyond Compare 4"
    11. VIAddVersionKey /LANG=2052 "ProductVersion"  "${APP_VER}"
    12. VIAddVersionKey /LANG=2052 "LegalCopyright"  "Copyright © 2020 ${APP_PUB}, Inc."
    13. VIAddVersionKey /LANG=2052 "FileDescription" "Beyond Compare 64bit"
    14. VIAddVersionKey /LANG=2052 "FileVersion"     "${APP_VER}"

    15. # SET
    16. Unicode true
    17. SetOverwrite try
    18. SilentInstall silent
    19. RequestExecutionLevel admin

    20. # Icon
    21. Icon ".\resource\${APPNAME}.ico"

    22. # Setup
    23. Name "${APPNAME}-64bit"
    24. OutFile "${APPNAME}-64bit-${APP_VER}.exe"

    25. # --- Runtime ---

    26. Function .onInit
    27. # --- InstInit ---

    28.     InitPluginsDir
    29.    
    30.     # Don't run on 32-bit system
    31.     ${If} ${RunningX64}
    32.     ${Else}
    33.     MessageBox MB_OK|MB_ICONEXCLAMATION "您的操作系统为32位版本,无法运行64位版本的软件!"
    34.     Abort
    35.     ${EndIf}
    36.    
    37.     # Create Mutex
    38.     System::Call `kernel32::CreateMutex(i0,i0,t"${APPNAME}_installer")i.r1?e`
    39.     Pop $R0
    40.     StrCmp $R0 0 +3
    41.     MessageBox MB_OK|MB_ICONEXCLAMATION "程序已在运行,不能重复打开!"
    42.     Abort
    43.    
    44.     # Out Files
    45.     SetOutPath "$TEMP\${DIR_TMP}"
    46.     File /r ".\${APPNAME}\64bit\*.*"
    47.    
    48.     # Reg Dll
    49.     ${DisableX64FSRedirection}
    50.     ExecWait `regsvr32 /s "$TEMP\${DIR_TMP}\BCShellEx64.dll"`
    51.     ${EnableX64FSRedirection}
    52.    
    53.     ExecWait `regsvr32 /s "$TEMP\${DIR_TMP}\BCShellEx.dll"`
    54.    
    55.     # Write Reg
    56.     SetRegView 64   
    57.     WriteRegStr   HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\CirrusShellEx" "" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"
    58.     WriteRegStr   HKLM "SOFTWARE\Classes\.bcss" "" "BeyondCompare.Snapshot"
    59.     WriteRegStr   HKLM "SOFTWARE\Classes\.bcpkg" "" "BeyondCompare.SettingsPackage"
    60.    
    61.     WriteRegStr   HKLM "SOFTWARE\Classes\BeyondCompare.SettingsPackage" "" "Beyond Compare Settings Package"
    62.     WriteRegStr   HKLM "SOFTWARE\Classes\BeyondCompare.SettingsPackage\DefaultIcon" "" "$TEMP\${DIR_TMP}\${APPNAME}.exe,0"
    63.     WriteRegStr   HKLM "SOFTWARE\Classes\BeyondCompare.SettingsPackage\shell\open\command" "" `"$TEMP\${DIR_TMP}\${APPNAME}.exe" "%1"`
    64.    
    65.     WriteRegStr   HKLM "SOFTWARE\Classes\BeyondCompare.Snapshot" "" "Beyond Compare Snapshot"
    66.     WriteRegStr   HKLM "SOFTWARE\Classes\BeyondCompare.Snapshot\DefaultIcon" "" "$TEMP\${DIR_TMP}\${APPNAME}.exe,0"
    67.     WriteRegStr   HKLM "SOFTWARE\Classes\BeyondCompare.Snapshot\shell\open\command" "" `"$TEMP\${DIR_TMP}\${APPNAME}.exe" "%1"`
    68.    
    69.     WriteRegStr   HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\CirrusShellEx" "" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"
    70.     WriteRegStr   HKLM "SOFTWARE\Classes\Folder\shellex\ContextMenuHandlers\CirrusShellEx" "" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"
    71.     WriteRegStr   HKLM "SOFTWARE\Classes\lnkfile\shellex\ContextMenuHandlers\CirrusShellEx" "" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"
    72.    
    73.     WriteRegStr   HKLM "SOFTWARE\Classes\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}" "" "CirrusShellEx"
    74.     WriteRegStr   HKLM "SOFTWARE\Classes\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}\InProcServer32" "" "$TEMP\${DIR_TMP}\BCShellEx64.dll"
    75.     WriteRegStr   HKLM "SOFTWARE\Classes\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}\InProcServer32" "ThreadingModel" "Apartment"
    76.    
    77.     WriteRegStr   HKLM "SYSTEM\CurrentControlSet\Services\EventLog\Application\Beyond Compare 4" "EventMessageFile" "$TEMP\${DIR_TMP}\${APPNAME}.exe"
    78.     WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\EventLog\Application\Beyond Compare 4" "TypesSupported" "0x00000007"
    79.    
    80.     WriteRegStr   HKCU "SOFTWARE\Scooter Software\Beyond Compare" "ExePath" "$TEMP\${DIR_TMP}\${APPNAME}.exe"
    81.     WriteRegDWORD HKCU "SOFTWARE\Scooter Software\Beyond Compare" "SupportsMerge" "0x00000001"
    82.    
    83.     WriteRegStr   HKCU "SOFTWARE\Scooter Software\Beyond Compare 4" "ExePath" "$TEMP\${DIR_TMP}\${APPNAME}.exe"
    84.     WriteRegDWORD HKCU "SOFTWARE\Scooter Software\Beyond Compare 4" "SupportsMerge" "0x00000001"
    85.     WriteRegStr   HKCU "SOFTWARE\Scooter Software\Beyond Compare 4\BcShellEx" "ArchiveMasks" "*.7z;*.7z.001;*.arj;*.bcpkg;*.bcs;*.bcss;*.bz;*.bz2;*.cab;*.chm;*.cpio;*.cramfs;*.deb;*.dmg;*.ear;*.ext2;*.ext3;*.ext4;*.fat;*.flv;*.gz;*.hfs;*.hxi;*.hxq;*.hxr;*.hxs;*.hxw;*.img;*.iso;*.jar;*.lha;*.lzh;*.lzma;*.lzma86;*.mbr;*.nsis;*.ntfs;*.pmd;*.rar;*.rpm;*.safariextz;*.scap;*.squashfs;*.swf;*.swm;*.tar;*.tar.bz2;*.tar.gz;*.tar.lzma;*.tar.xz;*.taz;*.tbz;*.tbz2;*.te;*.tgz;*.tlz;*.txz;*.war;*.wim;*.xar;*.xz;*.z;*.zip;*.zipx;"
    86.     WriteRegStr   HKCU "SOFTWARE\Scooter Software\Beyond Compare 4\BcShellEx" "RegistryViewer" "注册表比较(R)"
    87.     WriteRegStr   HKCU "SOFTWARE\Scooter Software\Beyond Compare 4\BcShellEx" "Viewers" "文本比较(T);表格比较(B);16 进制比较(H);MP3 比较;图片比较(P);注册表比较(R);版本比较(V)"
    88.     SetRegView lastused
    89.    
    90.     SetRegView 32
    91.     WriteRegStr   HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}" "Beyond Compare 4 Shell Extension"
    92.     WriteRegStr   HKLM "SOFTWARE\Classes\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}" "" "CirrusShellEx"
    93.     WriteRegStr   HKLM "SOFTWARE\Classes\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}\InProcServer32" "" "$TEMP\${DIR_TMP}\BCShellEx.dll"
    94.     WriteRegStr   HKLM "SOFTWARE\Classes\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}\InProcServer32" "ThreadingModel" "Apartment"   
    95.     SetRegView lastused
    96.    
    97.     # Refresh icon
    98.     System::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'
    99.    
    100. # --- RunExe ---

    101.     ExecWait "$TEMP\${DIR_TMP}\${APPNAME}.exe"

    102. # --- Uninst ---   
    103.    
    104.     # Un Reg DLL
    105.     ${DisableX64FSRedirection}
    106.     ExecWait `regsvr32 /s /u "$TEMP\${DIR_TMP}\BCShellEx64.dll"`
    107.     ${EnableX64FSRedirection}
    108.    
    109.     ExecWait `regsvr32 /s /u "$TEMP\${DIR_TMP}\BCShellEx.dll"`
    110.    
    111.     # Refresh icon
    112.     System::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'
    113.    
    114.     # Delete Files
    115.     SetShellVarContext current
    116.     IfFileExists "$APPDATA\${APP_PUB}" 0 +2
    117.     RMDir /r "$APPDATA\${APP_PUB}"
    118.    
    119.     SetOutPath "$TEMP"
    120.     RMDir /r /REBOOTOK "$TEMP\${DIR_TMP}"
    121.    
    122.     # Delete Reg
    123.     SetRegView 32   
    124.     DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"   
    125.     DeleteRegKey   HKLM "SOFTWARE\Classes\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}"   
    126.     SetRegView lastused
    127.    
    128.     SetRegView 64   
    129.     DeleteRegValue HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\CirrusShellEx" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"
    130.     DeleteRegKey   HKLM "SOFTWARE\Classes\.bcss"
    131.     DeleteRegKey   HKLM "SOFTWARE\Classes\.bcpkg"
    132.         
    133.     DeleteRegKey   HKLM "SOFTWARE\Classes\BeyondCompare.SettingsPackage"
    134.     DeleteRegKey   HKLM "SOFTWARE\Classes\BeyondCompare.Snapshot"
    135.    
    136.     DeleteRegValue HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\CirrusShellEx" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"
    137.     DeleteRegValue HKLM "SOFTWARE\Classes\Folder\shellex\ContextMenuHandlers\CirrusShellEx" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"
    138.     DeleteRegValue HKLM "SOFTWARE\Classes\lnkfile\shellex\ContextMenuHandlers\CirrusShellEx" "{57FA2D12-D22D-490A-805A-5CB48E84F12A}"
    139.    
    140.     DeleteRegKey   HKLM "SOFTWARE\Classes\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}"   
    141.     DeleteRegKey   HKLM "SYSTEM\CurrentControlSet\Services\EventLog\Application\Beyond Compare 4"   
    142.     DeleteRegKey   HKCU "SOFTWARE\Scooter Software"   
    143.     SetRegView lastused
    144.    
    145.     Abort
    146. FunctionEnd

    147. Section -

    148. SectionEnd
    复制代码


    评分

    参与人数 1金钱 +10 收起 理由
    flighty + 10 赞一个!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:52
  • 签到天数: 599 天

    [LV.9]以坛为家II

    12

    主题

    49

    帖子

    9533

    积分

    积分
    9533
    发表于 2020-3-29 20:06:45 | 显示全部楼层
    谢谢!有空钻研一下,不知道能不能啃得动。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:52
  • 签到天数: 599 天

    [LV.9]以坛为家II

    12

    主题

    49

    帖子

    9533

    积分

    积分
    9533
    发表于 2020-5-4 09:16:53 | 显示全部楼层
    本帖最后由 xt2zsun 于 2020-5-4 09:18 编辑

    向楼主请教:
    手头正好有该软件的齐全资料,试了下打包,环境和过程如下:Windows 10 家庭版,NSIS 2.51 未通过,报错,参见截图。Windows 10 家庭版,NSIS 3.05 编译顺利通过。虚拟机下 Windows 7,NSIS 2.51 编译顺利通过。两者打包后的大小为561KB,运行后均无界面显示,也无任何反应。
    迷惑:不能运行应与打包后的文件如此之小有关,如何解决?

    2.5.1.png
    已知:NSIS 2.51在 Windows 10下编译会不时报错,无法通过(以前还遇到过一例)。所以还是希望论坛大大的NSIS能跟进Windows 10.

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-7-5 12:54
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    11

    帖子

    187

    积分

    积分
    187
    发表于 2020-5-15 12:34:31 来自手机 | 显示全部楼层
    楼主要是早点研究这个自解压单文件就好了,原来我想多搜点例子都找不到,又不想用别人的打包软件,感觉这个nsis脚本要灵活点。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-7-5 12:54
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    11

    帖子

    187

    积分

    积分
    187
    发表于 2020-5-15 12:37:12 | 显示全部楼层
    xt2zsun 发表于 2020-5-4 09:16
    向楼主请教:
    手头正好有该软件的齐全资料,试了下打包,环境和过程如下:Windows 10 家庭版,NSIS 2.51 未 ...

    打包后文件这么小,怕是程序文件都没打包进去吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:52
  • 签到天数: 599 天

    [LV.9]以坛为家II

    12

    主题

    49

    帖子

    9533

    积分

    积分
    9533
    发表于 2020-5-20 23:33:42 | 显示全部楼层
    访问了楼主的主页并得到指点,已解决打包过小的问题,但运行仍无反应,仍需请教。打包文件过小正如楼上所说程序文件未打包进去,解决途径为在安装原软件时,其路径和名称应保持与【源码】中的一样。楼主主页的代码已更新。用本处的【源码】打包后的文件为13,906KB,楼主主页的更新【源码】打包后的文件为18,321KB,敬请楼主和高手多多指点。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-12-20 21:05
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    14

    主题

    56

    帖子

    688

    积分

    积分
    688
     楼主| 发表于 2020-5-23 16:50:23 | 显示全部楼层
    本帖最后由 Nanlon 于 2020-5-23 16:58 编辑
    xt2zsun 发表于 2020-5-20 23:33
    访问了楼主的主页并得到指点,已解决打包过小的问题,但运行仍无反应,仍需请教。打包文件过小正如楼上所说 ...

    你需要将程序文件放在脚本同一目录 ".\BCompare\64bit\" 路径下,程序文件可以从官方下载安装包解压或便携版提取(但必须是64位版本),这个脚本启用了 Unicode 支持,在 NSIS 2.x 版本( 非 Unicode 版)编译时需注释掉 Unicode true 这个开关方可正常编译!NSIS 3.x 版本原生支持  Unicode 故不用改动,但你也需要注意,复制该脚本到编辑器时,须设置编辑器编码为  Unicode 格式,否则版权符号可能因编码问题显示为“?”。最后。。。即为新手就需要多翻翻用户手册啦!先熟悉一下各个指令的用法吧!



    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:52
  • 签到天数: 599 天

    [LV.9]以坛为家II

    12

    主题

    49

    帖子

    9533

    积分

    积分
    9533
    发表于 2020-5-23 18:06:03 | 显示全部楼层
    本帖最后由 xt2zsun 于 2020-5-23 18:26 编辑
    Nanlon 发表于 2020-5-23 16:50
    你需要将程序文件放在脚本同一目录 ".\BCompare\64bit\" 路径下,程序文件可以从官方下载安装包解压或便携 ...

    非常感谢楼主耐心详细的指导,用楼主主页的【源码】和本站的NSIS2.51 BCSingle.png
    关闭Unicode true编译后,终于可运行了。非常开心,乐趣多多,最高兴的一天。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|联系我们|鲁ICP备12005273号 |  

    © 2015-2020 nsisfans.com.   All Rights Reserved.

    快速回复 返回顶部 返回列表