如何制作便携软件 【一】 如何使用NSIS导入注册表

今天在五谷轮回的时候,我冒出了一个想法,授人以鱼不如授人以渔。要让PortableApps在我们国家遍地开花,就要贴近基层,依靠群众,走基层,传经验,讲方法,要用走传讲的方法,做到人人会做,人人爱做。凭我一个人埋头苦干可不行。所以,我决定开办一个小小的专题,记录我在制作便携软件中总结的一些经验和方法。本质而言,我也是一个菜鸟,现学现卖,难免有许多谬误。所以,您要用怀疑的眼光看我的笔记,用探索的精神从我的肩头更进一步。如果发现我的谬误或局限,请留言告诉我(不是请求,这是用户协议,若不同意请不要按下一步 😈 )。我会不断修正每一篇笔记。并不定期更新。

闲言少叙,今天要谈的是:在NSIS中怎么导入注册表。

这有何难,用registry插件嘛:

可是,如果你经常在 RestoreKey 后面用 {registry:write} ,就会发现,往往导入注册表会失败,或者写入的键值被reg文件中的旧键值覆盖了,这是为什么呢?

原来,${registry::RestoreKey} 这个命令并不会等待导入完成。作者在文档中写了:

${registry::RestoreKey} simply exec regedit:  regedit /s “[file]”

执行的是 Exec 而非 ExecWait 。那么,可能 regedit.exe 尚未启动,就开始执行下一行命令了。制作一般的安装包问题不大,但便携软件对执行步骤的顺序要求更加精确。所以,有些人的代码是这样写的:

睡一会。睡多久?睡一秒还是一年,这种盲人摸象的做法,我们完美主义者是不会使用的。因为这个命令,有些朋友凡是用到registry插件,都习惯性地加上个 sleep,这是完全没有必要的,作者说了:

问:So my question is, what other functions in your plugin behave in the same way (ie do not wait for the registry operation to finish)?

答:registry::RestoreKey is the only one.

http://forums.winamp.com/showpost.php?p=2225200&postcount=105

那么,用:

不就行了吗?

你又错了,我们制作便携软件的时候,要对自己严格要求,在Vista以上的系统中,不经过UAC验证,是无法执行 regedit /s 这个命令的(即使导入HKCU中的键值也不行)。难道你的每个软件都要用户通过UAC验证以管理员权限运行吗,完全是别有居心!

可是,在UAC环境的测试中,你会发现,即使不通过UAC验证,{registry::RestoreKey} 这个命令也可以完成注册表导入,难道,作者隐瞒了什么?

于是,作为代码盲的你,充满狐疑地打开 NSIS\Include\Registry.nsh ,找到这样一段代码:

真是狡兔三窟!registry::RestoreKey失败后,用reg.exe import,失败后,又用 regedit.exe /s,我们就要有这种不屈不挠的精神,不要让一次执行的失败变成Bug。

眼尖的你发现,关键在于这一行:

原来,虽然regedit /s需要管理员权限,但reg import命令并不需要,这就是{registry::RestoreKey}成功的秘诀。

但是,${registry::RestoreKey}首先尝试用插件导入,而插件并不等待导入结束,所以,我们在应用的时候,要把顺序颠倒一下:

nsExec::ExecToStack是等待运行结束的,首先执行,假如失败,再用{registry::RestoreKey},并暂停0.5秒(比较安全的数值)。当以上动作始终返回Error的时候,我们就应该考虑做个标记,在便携软件结束的时候跳过这一次软件运行中的注册表修改,不覆盖原先的reg文件了。

不过,当你翻阅 PortableApps.com Launcher 的源代码时,却发现关于注册表导入,仅仅用了一行:

可为什么感觉上PAL那么稳定,极少出错呢?我猜是因为PAL的代码非常繁杂,每个实际动作以前都有一堆工作,又是读Launcher.ini,又是转换变量,又是检测PAF平台,慢悠悠的,慢工出细活吧!

《如何制作便携软件 【一】 如何使用NSIS导入注册表》目前有 22 个评论。

  1. 作为一个学经济的,除了一点点点点简单的C语言,就啥都不懂了,还是最初的一个不用什么软件用模板的教程能看懂一些,这个。。。完全不知所云了。。。

  2. 支持!我也一直想整理些教程呢。

  3. 支持教程 让更多人了解作法

  4. 这才是中国特色,其他博客好像没有这方面的教程

  5. 博主真是太好了,出教程,然后再收录一下优秀作品投稿。 portableappc就壮大啦!

  6. 本人是彻彻底底的新手啊,站主的教程多么希望多考虑一下我这类的新手啊

  7. 非常感谢出教程,学习一下,自己做几个软件。

  8. 我收集了很多paf.exe,但是没时间亲自自己做一个,希望一起讨论和制作,申请了一个qq群,
    184159629
    希望一起讨论

  9. 一直在博客上不遗余力的推荐PortableApps
    不过不像你,是行动派啊

    有个PortableAppz,是你一个国外的同行
    很多国外著名的商业软件他也在做

  10. 地址是这个,你应该注意过了
    portableappz.blogspot.com

    • 是的,我一早就加上他的链接了。

      其实我对PortableAppZ的作者很好奇。PortableAppZ完全是一个人(叫Bernat)办的,他一个人做了上百个便携软件,保证在软件更新的同一天推出便携版(而PortableApps往往要一个星期),每天都更新上十个软件。他的博客没有广告,没有留言的地方,也无法联系他。他博客的名字在其它“合法”的论坛属于敏感词,必须转换(比如把O写成0)才不会被管理员删除。他的用户无法对他表达感谢,“合法”论坛对他不遗余力地污蔑(例如说他放病毒)。在没有任何盈利(精神或物质)的情况下,他矢志不渝像头黄牛地更新便携软件,这是什么样的精神……

      • 也是为了避免很多不必要的麻烦吧
        毕竟在国外对版权的保护还是非常严格的
        如果他的信息泄露了,对他本人伤害将很大啊

        • 是啊。首先是对他的动机不解,也许是个超脱的人,唯一的乐趣就是争分夺秒地发布更新,这点俺自愧不如。

          其次也对他的博客能在Blogspot存活至今不解。投诉他的人大概不少,最严重的后果就是他建了个 portableapptrash.blogspot.com ,把PhotoShop什么的转移过去了,从此无事……也在PortableApps.com的论坛看到他们讨论要“对付”他,但是Google繁琐的程序让这几乎变成不可能。可能Google真的是一把巨大的保护伞吧。

  11. 希望楼主能够继续出教程,我也学习一下PortableApps格式的制作。羞愧啊,洋码子看的特别吃亏。

  12. portableappz.blogspot.com

    我这里是的打不开的

  13. 好想有视频教程啊。这些东西看得头都大啦。弄了几天啦。还是搞不懂。

  14. 希望楼主能出个coreldraw x5的便携版。

我要留言:

您的大名(必填):

您的邮箱(必填,不会公开):

您的网站(选填):

您的评论: