Archive for August, 2007

Inno Setup 对比 Nullsoft Scriptable Install System

inno 和 nullsoft 这2个安装软件,很早很早就听说过了,但一直没有使用过。 这2天对比了一下,谈一下初步印象。

inno 是用delphi写的,里面居然套了一个pascal 的脚本解释器,还可以debug ,设置断点,单步调试,奇妙的思路,令我叹为观止。安装过程中,TEdit, TMemo, TCheckBox, 大凡delphi里的控件,安装脚本都可以调用,并打包在安装文件之中。美中不足之处,是安装文件稍微大点,我测试了一下,什么文件也没有包装,就要200多K。

nullsoft 的特点是安装包非常小,符合我的口味。不太好的是需要学习它的脚本语言,对程序员来说,这也不算什么。

试过几个语法加亮的编辑器,推荐使用:HM NIS EDIT: A Free NSIS Editor/IDE

下载地址 http://hmne.sourceforge.net 感觉比较爽。但是也有美中不足,无法单步调试。

使用nullsoft install 在setup.exe 里,增加版本信息

!insertmacro MUI_LANGUAGE "SimpChinese"

  VIProductVersion "1.2.3.4"
  VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "ProductName" ${PRODUCT_NAME}
  VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "Comments" ""
  VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "CompanyName" ${PRODUCT_PUBLISHER}
  VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "LegalTrademarks" ${PRODUCT_NAME}
  VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "LegalCopyright" ${PRODUCT_PUBLISHER}
  VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "FileDescription" ${PRODUCT_NAME}
  VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "FileVersion" ${PRODUCT_VERSION}

注意,MUI_LANGUAGE 和version只能放在脚本最后,不然会有一堆警告。
Define the LangStrings after you insert the MUI_LANGUAGE macros. Insert the MUI_LANGUAGE macros after you insert the page macros.

nullsoft 里面,增加splash画面的方法:

Function .onInit
InitPluginsDir
File /oname=$PLUGINSDIR\splash.bmp "splash.bmp"
splash::show 1000 $PLUGINSDIR\splash

用 MessageBox MB_OK $PLUGINSDIR 显示一下变量$PLUGINSDIR,发现是:
C:\Documents and Settings\z\Local Settings\Temp\nsz2A2.tmp

进入这个目录,看到splash.bmp 和 splash.dll好好地在里面躺着呢。在对比一下 C:\Program Files\NSIS\Plugins\splash.dll, 豁然开朗,原来,splash功能是nullsoft 的一个插件,如果安装软件使用了这个功能,肯定要把splash.dll打包进入setup.exe。别的插件,也应该是这样的了。53K bmp +4K DLL, 安装包只增大10多k, nullsoft 的压缩率还是很高的

在安装程序里,增加一个edit框,并把用户输入的text,写入安装目录下的配置文件里:

ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
ReserveFile "test.ini"

;Order of pages
Page custom CreateCustom LeaveCustom ": Testing InstallOptions" ;Custom page. InstallOptions gets called in SetCustom.

Function CreateCustom

;Display the InstallOptions dialog
Push ${TEMP1}

InstallOptions::dialog "$PLUGINSDIR\test.ini"
Pop ${TEMP1}

Pop ${TEMP1}

FunctionEnd

Function LeaveCustom
ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 3" "State"
WriteINIStr "$INSTDIR\config.ini" "ServerIp" "State" ${TEMP1}

FunctionEnd

Function .onInit

;Extract InstallOptions files
;$PLUGINSDIR will automatically be removed when the installer closes

InitPluginsDir
File /oname=$PLUGINSDIR\test.ini "test.ini"

FunctionEnd

马飞涛

评论

学习ace和ice 后的初步观感

这段时间学习一下ace和ice。

ace的语法风格,初步观感只能用"呕呀啁哳难为听"来形容了。在windows下用的是proactor模式,完成端口实现的,据说在linux下不支持proactor模式,只能用reactor模式利用epoll来实现,而windows下,reactor模式,只能支持64个连接。 这也能叫跨平台?

用google找了一下采用ace的开源项目,发现一个事实比较惊人,那就是除了ace自己,几乎没有一个开源项目采用ace作为低层通信平台。如果谁知道,告诉老马一声,让俺也学习一下。

相比之下,ice的语法风格,观感很舒服。借用 ice.pdf手册里的一段话:
你很难把这些C++ 代码和一个普通的C++ 程序
区分开来。这是Ice 的最大的优点之一:访问远地对象就和访问普通的本地
C++ 对象一样容易。这样,你就可以把精力放在该放的地方,也就是说,
集中精力开发你的应用逻辑,而不用去和晦涩的网络APIs 作斗争。我们将
在第11 章看到,对服务器端来说同样也是如此,也就是说, 你可以轻松而
高效地开发分布式应用。

看了一下slice2cpp编译出来的文件,也是比较晦涩的,但是除了这个头文件,前端让程序员用着,还是很舒服的。

马飞涛

评论


0.015 sec