如果你使用过NSIS为你的项目制作过安装包,那HM nisedit一定是你绕不过去的槛,作为NSIS号称的最佳免费IDE/编辑器,功能齐全,与NSIS配合性能强悍,实至名归 。只是开发作者最后版本更新在2005年已经停止,国内汉化版修修补补也仅仅坚持到2006年未再继续,时至今日,已经过去十几年,与新版操作系统和新版NSIS(3.0X)出现了各种不兼容和BUG,其中最典型的莫过于在vnsiedit中编辑好脚本后使用“编译并运行”功能,会出现请求的操作需要提升,代码740系统警告并停止执行,
文章插图
经过分析,我个人认为这与新操作系统安全机制更新有直接关系,说到这里,又不得不提及windows的用户帐户控制(UAC)机制,从 Windows Vista开始,微软引入了额外的安全级别(UAC),要求在安装应用程序完成其他任务之前提示用户输入管理密码,以标准用户身份登录到 Windows Vista 的用户(Vista 的默认登录名)只能写入磁盘上的特定位置 。在 Windows 7 及更高版本上,UAC 的侵入性比在 Vista 上要小的多 。但这些安全机制的更改,仍然让HM VNSIEDIT这类开发应用于XP及更低系统的应用出现了各种不兼容 。而当前新开发应用应对UAC控制的主要办法是为程序配置嵌入程序清单,注明执行级别!至于开发于小二十年前的VNSIEDIT,由于受当时开发环境所限,根本没有嵌入完善的程序清单,这是当前在使用中会出现需要提升权限的直接原因!
解决方案:
既然原因找到,那接下来就是解决问题了,没有程序清单,有两个解决方案,1.重新编译Vnsiedit,为其嵌入完善的程序清单 。2.直接为现有的Vnsiedit配置外部清单 。因为我们是在解决当前的使用bug,而不是为新系统重新改良Vnsiedit的整体兼容性,所以第二个方案就成了不二选择!
所谓程序清单,其实是一个XML文件,正常情况下会在程序或应用编译时被嵌入其中,当然,如果你不嫌弃业余或不优雅,外置清单也是可以使用的!具体到NSIS中,实战脚本如下:
#编写:水晶石#给vnsiedit添加外部程序清单并强制优先使用OutFile 'Nsismanifest.exe'SectionGetTempFileName $R0FileOpen $1 $R0 "w" #程序清单其实是一个XML文件,这里将内容按照标准格式写入临时文件后再去更名 FileWrite $1 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>$\r$\n' FileWrite $1 '<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">$\r$\n' FileWrite $1 ' <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">$\r$\n' FileWrite $1 ' <security>$\r$\n' FileWrite $1 ' <requestedPrivileges>$\r$\n' FileWrite $1 ' <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>$\r$\n' FileWrite $1 " </requestedPrivileges>$\r$\n" FileWrite $1 " <security>$\r$\n" FileWrite $1 " </trustInfo>$\r$\n" FileWrite $1 "</assembly>>$\r$\n" FileClose $1 CopyFiles /SILENT $R0 "VNISEdit.exe.manifest" ; 复制临时文件至目标文件位置并更名 Delete $R0 SetRegView 64 #注意系统重定向 #关键一步,写入参数,强制程序优先使用程序外部清单 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide" "PreferExternalManifest" 0x00000001SectionEnd
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 中山陵在南京哪个区
- C#/VB.NET 读取条码类型及条码在图片中的坐标位置
- 北京站站内换乘怎么换
- 异镇中龙九怎么死的
- 关于穿越的动漫或电视剧
- 汉族姓金的祖籍在哪里
- vivox9i怎么查话费
- 中国第一台火车头在哪里生产
- 九华山在池州吗
- 转机时间太长可以出机场吗