原创文章,转载请注明出处。
在网上看到许多关于MSDE2000集成到应用程序中一并安装的文章,这些方法无一例外都使用了InstallShield中调用外部命令的方式,其本质就是在安装过程中调用LaunchAppAndWait函数执行MSDE2000的setup.exe程序,这样一来,带来几个问题:
1、无法与应用程序的安装一并卸载;
2、无法实现MSDE2000的最小安装;
3、如果用户中途取消安装,程序不能完全回滚;
4、无法与应用程序安装到同一个目录。
如果使用installshield中的预安装功能,也仅能在MSI工程中使用,同时,也不能灵活地控制安装过程及实现上述功能,为此,我们需要一种方法,用于在安装过程中集成MSDE2000。这是因为许多应用需要SQL Server支持,而MSDE2000确实是一个不错的选择,撇开版权不说,仅全面兼容SQL和支持2G的数据量就足够了,如果能解决安装时的集成问题,就会为极大地方便应用程序的分发。
下面我通过具体实例来介绍这一方法。
目标一:实现不可控的最小安装。
一、数据准备:
1、下载SQL Server 2000 Desktop Engine (MSDE) 组件(SQL2000.MSDE-KB884525-SP4-x86.EXE)
2、双击下载的exe文件,解压缩至C:/SQL2KSP4,在运行中浏览至c:/SQL2KSP4/MSDE,找到setup.exe文件,双击它,不要急着点“确定”,在setup.exe后面空一格,接着输入安装参数:INSTANCENAME="fishout" SECURITYMODE=SQL SAPWD="fishout@TOM.COM" /L*v C:/MSDELog.log,点击确定(其中:INSTANCENAME="实例名",SAPWD="密码",可自行修改,以下均以命名实例“fishout”为例),待其安装完毕后不要启动服务,也不要重启机器,将C:/Program Files/Microsoft SQL Server/MSSQL$FISHOUT/文件夹下的binn、Data、log三个文件夹保留,其余的删除。
3、准备注册表入口。打开注册表编辑器,导航至:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server,删除多余的子健,使其看上去如图所示:
再在SuperSocketNetLib子键下面的ProtocolList属性中增加两个字符串:tcp/np,右击Microsoft SQL Server,选择导出注册表,文件名任意取,打开并编辑已导出的注册表文件,将安装路径“C:/Program Files/Microsoft SQL Server”替换为“<TARGETDIR>”,使其修改完成的注册表文件如下:
二、设计制作安装程序:
1、在installshield中新建一个InstallScript Project工程,命名为MDSE2000,在工程文件夹下新建files文件夹,复制刚才安装目录下MSSQL$FISHOUT文件夹到工程files中,复制C:/WINDOWS/System32/msvcp71.dll及msvcr71.dll文件到files/MSSQL$FISHOUT/Binn中(不要遗忘这个文件),设置Product Properties中TARGETDIR内容为:<FOLDER_APPLICATIONS>/Microsoft SQL Server,添加files中MSSQL$FISHOUT文件夹到Application Target Folder中。
2、导入注册表。在Registry注册表入口中右击Destination Computer,单击New Registry Set,重命名为:MDSE2000,右击它,点击:Import REG File...,导入刚才已修改好的注册表设置,在右边勾选与此关联的安装文件组。
3、在安装脚本中点选DefaultFeature,生成Installed事件,代码如下:
4、编译生成安装程序,可以看到,生成的安装包仅有12.4兆,比微软原来的安装包要小多了,非常利于网络传输和应用程序的分发,不过,有一个致命的缺点,就是不支持安装路径的更改,这个问题,放在下一节解决。