| 管理员   
 | 
						1#
													大							中
							小												发表于 2013-7-28 12:55 																					只看该作者 
																		
													如何在vs的setup project中,设置安装完成后自动打开一个html文件?本人在vs2008中,做了一个安装包,想在安装结束之后,出现一个checkbox,当用户选中时,自动打开一个安装目录中的html文件,如何做?于是google,找到一个比较接近的文章,
http://stackoverflow.com/questions/1668274/run-exe-after-msi-installation
于是稍稍改造了一下,其中的ModifyMsiToEnableLaunchApplication.js,如下:
复制内容到剪贴板 代码:// EnableLaunchApplication.js <msi-file>start.cmd// Performs a post-build fixup of an msi to launch a specific file when the install has completed
 // Configurable values
 var checkboxChecked = true;                     // Is the checkbox on the finished dialog checked by default?
 var checkboxText = "启动设计器";      // checkbox提示
 var filename = "start.cmd";       // checkbox勾选时自动执行这个 cmd,这个cmd文件,需要放在安装目录中
 // Constant values from Windows Installer
 var msiOpenDatabaseModeTransact = 1;
 var msiViewModifyInsert         = 1;
 var msiViewModifyUpdate         = 2;
 var msiViewModifyAssign         = 3;
 var msiViewModifyReplace        = 4;
 var msiViewModifyDelete         = 6;
 if (WScript.Arguments.Length != 1)
 {
 WScript.StdErr.WriteLine(WScript.ScriptName + " file");
 WScript.Quit(1);
 }
 var filespec = WScript.Arguments(0);
 var installer = WScript.CreateObject("WindowsInstaller.Installer");
 var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);
 var sql;
 var view;
 var record;
 try
 {
 var fileId = FindFileIdentifier(database, filename);
 if (!fileId)
 throw "Unable to find '" + filename + "' in File table";
 WScript.Echo("Updating the Control table...");
 // Modify the Control_Next of BannerBmp control to point to the new CheckBox
 sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BannerBmp'";
 view = database.OpenView(sql);
 view.Execute();
 record = view.Fetch();
 record.StringData(11) = "CheckboxLaunch";
 view.Modify(msiViewModifyReplace, record);
 view.Close();
 // Insert the new CheckBox control
 sql = "INSERT INTO `Control` (`Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help`) VALUES ('FinishedForm', 'CheckboxLaunch', 'CheckBox', '9', '201', '343', '12', '3', 'LAUNCHAPP', '{\\VSI_MS_Sans_Serif13.0_0_0}" + checkboxText + "', 'CloseButton', '|')";
 view = database.OpenView(sql);
 view.Execute();
 view.Close();
 // 这里需要注意,stackoverflow原文中没有,加这段时为了在用msi删除安装时,避免出现checkbox
 sql = "INSERT INTO `ControlCondition` (`Dialog_`, `Control_`, `Action`, `Condition`) VALUES ('FinishedForm', 'CheckboxLaunch', 'Hide', 'Installed')";
 view = database.OpenView(sql);
 view.Execute();
 view.Close();
 WScript.Echo("Updating the ControlEvent table...");
 // Modify the Order of the EndDialog event of the FinishedForm to 1
 sql = "SELECT `Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering` FROM `ControlEvent` WHERE `Dialog_`='FinishedForm' AND `Event`='EndDialog'";
 view = database.OpenView(sql);
 view.Execute();
 record = view.Fetch();
 record.IntegerData(6) = 1;
 view.Modify(msiViewModifyReplace, record);
 view.Close();
 // Insert the Event to launch the application
 sql = "INSERT INTO `ControlEvent` (`Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering`) VALUES ('FinishedForm', 'CloseButton', 'DoAction', 'VSDCA_Launch', 'LAUNCHAPP=1', '0')";
 view = database.OpenView(sql);
 view.Execute();
 view.Close();
 WScript.Echo("Updating the CustomAction table...");
 // 创建一个自定义action, 注意,这里的 Target,是参数,也就是说安装目录,作为参数传到 start.cmd中
 sql = "INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) VALUES ('VSDCA_Launch', '210', '" + fileId + "', '\"[TARGETDIR]"')";
 view = database.OpenView(sql);
 view.Execute();
 view.Close();
 if (checkboxChecked)
 {
 WScript.Echo("Updating the Property table...");
 // Set the default value of the CheckBox
 sql = "INSERT INTO `Property` (`Property`, `Value`) VALUES ('LAUNCHAPP', '1')";
 view = database.OpenView(sql);
 view.Execute();
 view.Close();
 }
 database.Commit();
 }
 catch(e)
 {
 WScript.StdErr.WriteLine(e);
 WScript.Quit(1);
 }
 function FindFileIdentifier(database, fileName)
 {
 // First, try to find the exact file name
 var sql = "SELECT `File` FROM `File` WHERE `FileName`='" + fileName + "'";
 var view = database.OpenView(sql);
 view.Execute();
 var record = view.Fetch();
 if (record)
 {
 var value = record.StringData(1);
 view.Close();
 return value;
 }
 view.Close();
 // The file may be in SFN|LFN format.  Look for a filename in this case next
 sql = "SELECT `File`, `FileName` FROM `File`";
 view = database.OpenView(sql);
 view.Execute();
 record = view.Fetch();
 while (record)
 {
 if (StringEndsWith(record.StringData(2), "|" + fileName))
 {
 var value = record.StringData(1);
 view.Close();
 return value;
 }
 record = view.Fetch();
 }
 view.Close();
 }
 function StringEndsWith(str, value)
 {
 if (str.length < value.length)
 return false;
 return (str.indexOf(value, str.length - value.length) != -1);
 }
复制内容到剪贴板 代码:Start /D%1 index.htm你需要把start.cmd,index.htm两文件放在安装目录中,比如, c:\program files\ibm\中,那么,安装结束时,会出现checkbox,默认是选中的,选中时,会自动在默认浏览器中,打开c:\program files\ibm\index.htm |