NSIS制作B/S架构安装程序

    开门见山,B/S架构应用程序的安装程序无非就是拷贝一些文件,检查一下环境配置,注册服务,启动服务之类的了。拷贝文件就没什么好说的了。下面着记录一下如下几点:

  1. 端口检查
  2. 读写注册表
  3. 调用外部可执行文件
  4. 注册、启动、停止服务
  5. 注册环境变量

  1. 端口检查
      ${If} ${TCPPortOpen} $port
      MessageBox MB_ICONINFORMATION|MB_OK "$portName端口号已经被使用,请使用新的端口"
      abort
      ${EndIf}

    这里面用到一个${TCPPortOpen}函数,需要使用到 !include Ports.nsh 头。
  2. 读写注册表
    ReadRegStr $jdkReg HKLM "SOFTWARE\JavaSoft\Java Development Kit\1.6" JavaHome
    这里面用到的ReadRegStr是一个内置函数,jdkReg用于存储读取的注册表项
    WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PATH" "$R0"
    WriteRegExpandStr 也是一个内置函数,R0存储PATH值的变量
  3. 调用外部可执行文件
    调用外部可执行文件可用于注册服务,例如注册Tomcat就需要调用service,bat 注册
    ExecWait '"$INSTDIR\Tomcat\bin\service.bat" install Tomcat'
    应用内部函数ExecWait执行service,bat,并传入两个参数
  4. 注册、启动、停止服务
    !insertmacro SERVICE "create" "mysql5" 'path="$baseDir\MySQL\MySQL Server 5.1\bin\mysqld.exe" –defaults-file="$baseDir\MySQL\MySQL Server 5.1\my.ini" mysql5;autostart=1;interact=;depend=;user=;password=;display=mysql5;description=WayneWan DO IT!;'
    应用SERVICE函数完成注册服务,需要头文件 !include Service.nsh
    !insertmacro SERVICE "start" "mysql5" ""
    启动服务,则参数改为 start
    !insertmacro SERVICE "stop" "mysql5" ""
    相应停止服务则用 stop
  5. 注册环境变量
    对于环境变量的注册则有一点点复杂,首先从NSIS安装程序中注册的环境变量,要想在后续步骤中使用,必须发送环境变量改变的广播,这样当前正在运行的进程才可能知道环境变量的改变。
    插一句读取环境变量的方法:ReadEnvStr $R0 "PATH",这一句是吧PATH环境变量读到R0变量中,ReadEnvStr是一个内置函数。
    其实注册环境变量也就是向相应的注册表项中写值,关键问题就在发广播。
    WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "JAVA_HOME" "$jdkReg"
    SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=100
    第一句是添加环境变量,第二句式发送广播,后面的TIMEOUT好像是延时时间,没有深入研究。
    ps:在我用这种方法注册环境变量过后发现后续步骤注册Tomcat服务的时候还是总读不到需要的环境变量,于是采取了一个变通办法,先用下面方法生成一个零时的环境变量。
    System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("CATALINA_HOME", "$baseDir\Tomcat").r2'
    这一句调用内部函数注册CATALINA_HOME零时环境变量$baseDir\Tomcat,至于后面r2没有搞懂是什么意思。

  

Leave a Reply

Your email address will not be published. Required fields are marked *

You must enable javascript to see captcha here!