猿问
下载APP

安装msi后运行exe?

安装msi后运行exe?

使用Visual Studio 2008创建msi以使用安装项目部署我的程序。我需要知道如何使msi运行它刚刚安装的exe。自定义动作?如果是这样,请说明在哪里/如何。谢谢。


繁花如伊
浏览 60回答 2
2回答

幕布斯7119047

这是一个常见的问题。我不会只使用自定义操作。我知道的唯一方法是在生成后修改.msi。我运行一个Javascript脚本作为一个后期构建事件来做到这一点。它在安装程序向导中插入一个新对话框,其复选框显示“Launch Application Foo?”。如果选中该复选框,则会有一个自定义操作来运行该应用。它显示为安装向导序列中的最后一个屏幕。看起来像这样:这是我用来修改MSI的脚本://&nbsp;EnableLaunchApplication.js&nbsp;<msi-file>//&nbsp;Performs&nbsp;a&nbsp;post-build&nbsp;fixup&nbsp;of&nbsp;an&nbsp;msi&nbsp;to&nbsp;launch&nbsp;a&nbsp;specific&nbsp;file&nbsp;when&nbsp;the&nbsp;install&nbsp;has&nbsp;completed//&nbsp;Configurable&nbsp;valuesvar&nbsp;checkboxChecked&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Is&nbsp;the&nbsp;checkbox&nbsp;on&nbsp;the&nbsp;finished&nbsp;dialog&nbsp;checked&nbsp;by&nbsp;default?var&nbsp;checkboxText&nbsp;=&nbsp;"Launch&nbsp;[ProductName]";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Text&nbsp;for&nbsp;the&nbsp;checkbox&nbsp;on&nbsp;the&nbsp;finished&nbsp;dialogvar&nbsp;filename&nbsp;=&nbsp;"WindowsApplication1.exe";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;The&nbsp;name&nbsp;of&nbsp;the&nbsp;executable&nbsp;to&nbsp;launch&nbsp;-&nbsp;change&nbsp;this&nbsp;to&nbsp;match&nbsp;the&nbsp;file&nbsp;you&nbsp;want&nbsp;to&nbsp;launch&nbsp;at&nbsp;the&nbsp;end&nbsp;of&nbsp;your&nbsp;setup//&nbsp;Constant&nbsp;values&nbsp;from&nbsp;Windows&nbsp;Installervar&nbsp;msiOpenDatabaseModeTransact&nbsp;=&nbsp;1;var&nbsp;msiViewModifyInsert&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1;var&nbsp;msiViewModifyUpdate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;2;var&nbsp;msiViewModifyAssign&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;3;var&nbsp;msiViewModifyReplace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;4;var&nbsp;msiViewModifyDelete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;6;if&nbsp;(WScript.Arguments.Length&nbsp;!=&nbsp;1){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.StdErr.WriteLine(WScript.ScriptName&nbsp;+&nbsp;"&nbsp;file"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Quit(1);}var&nbsp;filespec&nbsp;=&nbsp;WScript.Arguments(0);var&nbsp;installer&nbsp;=&nbsp;WScript.CreateObject("WindowsInstaller.Installer");var&nbsp;database&nbsp;=&nbsp;installer.OpenDatabase(filespec,&nbsp;msiOpenDatabaseModeTransact);var&nbsp;sql;var&nbsp;view;var&nbsp;record;try{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;fileId&nbsp;=&nbsp;FindFileIdentifier(database,&nbsp;filename); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!fileId) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;"Unable&nbsp;to&nbsp;find&nbsp;'"&nbsp;+&nbsp;filename&nbsp;+&nbsp;"'&nbsp;in&nbsp;File&nbsp;table"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;Control&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Modify&nbsp;the&nbsp;Control_Next&nbsp;of&nbsp;BannerBmp&nbsp;control&nbsp;to&nbsp;point&nbsp;to&nbsp;the&nbsp;new&nbsp;CheckBox &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"SELECT&nbsp;`Dialog_`,&nbsp;`Control`,&nbsp;`Type`,&nbsp;`X`,&nbsp;`Y`,&nbsp;`Width`,&nbsp;`Height`,&nbsp;`Attributes`,&nbsp;`Property`,&nbsp;`Text`,&nbsp;`Control_Next`,&nbsp;`Help`&nbsp;FROM&nbsp;`Control`&nbsp;WHERE&nbsp;`Dialog_`='FinishedForm'&nbsp;AND&nbsp;`Control`='BannerBmp'"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.StringData(11)&nbsp;=&nbsp;"CheckboxLaunch"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Modify(msiViewModifyReplace,&nbsp;record); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Insert&nbsp;the&nbsp;new&nbsp;CheckBox&nbsp;control &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`Control`&nbsp;(`Dialog_`,&nbsp;`Control`,&nbsp;`Type`,&nbsp;`X`,&nbsp;`Y`,&nbsp;`Width`,&nbsp;`Height`,&nbsp;`Attributes`,&nbsp;`Property`,&nbsp;`Text`,&nbsp;`Control_Next`,&nbsp;`Help`)&nbsp;VALUES&nbsp;('FinishedForm',&nbsp;'CheckboxLaunch',&nbsp;'CheckBox',&nbsp;'9',&nbsp;'201',&nbsp;'343',&nbsp;'12',&nbsp;'3',&nbsp;'LAUNCHAPP',&nbsp;'{\\VSI_MS_Sans_Serif13.0_0_0}"&nbsp;+&nbsp;checkboxText&nbsp;+&nbsp;"',&nbsp;'CloseButton',&nbsp;'|')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;ControlEvent&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Modify&nbsp;the&nbsp;Order&nbsp;of&nbsp;the&nbsp;EndDialog&nbsp;event&nbsp;of&nbsp;the&nbsp;FinishedForm&nbsp;to&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"SELECT&nbsp;`Dialog_`,&nbsp;`Control_`,&nbsp;`Event`,&nbsp;`Argument`,&nbsp;`Condition`,&nbsp;`Ordering`&nbsp;FROM&nbsp;`ControlEvent`&nbsp;WHERE&nbsp;`Dialog_`='FinishedForm'&nbsp;AND&nbsp;`Event`='EndDialog'"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.IntegerData(6)&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Modify(msiViewModifyReplace,&nbsp;record); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Insert&nbsp;the&nbsp;Event&nbsp;to&nbsp;launch&nbsp;the&nbsp;application &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`ControlEvent`&nbsp;(`Dialog_`,&nbsp;`Control_`,&nbsp;`Event`,&nbsp;`Argument`,&nbsp;`Condition`,&nbsp;`Ordering`)&nbsp;VALUES&nbsp;('FinishedForm',&nbsp;'CloseButton',&nbsp;'DoAction',&nbsp;'VSDCA_Launch',&nbsp;'LAUNCHAPP=1',&nbsp;'0')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;CustomAction&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Insert&nbsp;the&nbsp;custom&nbsp;action&nbsp;to&nbsp;launch&nbsp;the&nbsp;application&nbsp;when&nbsp;finished &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`CustomAction`&nbsp;(`Action`,&nbsp;`Type`,&nbsp;`Source`,&nbsp;`Target`)&nbsp;VALUES&nbsp;('VSDCA_Launch',&nbsp;'210',&nbsp;'"&nbsp;+&nbsp;fileId&nbsp;+&nbsp;"',&nbsp;'')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(checkboxChecked) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;Property&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;the&nbsp;default&nbsp;value&nbsp;of&nbsp;the&nbsp;CheckBox &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`Property`&nbsp;(`Property`,&nbsp;`Value`)&nbsp;VALUES&nbsp;('LAUNCHAPP',&nbsp;'1')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;database.Commit();}catch(e){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.StdErr.WriteLine(e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Quit(1);}function&nbsp;FindFileIdentifier(database,&nbsp;fileName){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;First,&nbsp;try&nbsp;to&nbsp;find&nbsp;the&nbsp;exact&nbsp;file&nbsp;name &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sql&nbsp;=&nbsp;"SELECT&nbsp;`File`&nbsp;FROM&nbsp;`File`&nbsp;WHERE&nbsp;`FileName`='"&nbsp;+&nbsp;fileName&nbsp;+&nbsp;"'"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(record) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;value&nbsp;=&nbsp;record.StringData(1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;The&nbsp;file&nbsp;may&nbsp;be&nbsp;in&nbsp;SFN|LFN&nbsp;format.&nbsp;&nbsp;Look&nbsp;for&nbsp;a&nbsp;filename&nbsp;in&nbsp;this&nbsp;case&nbsp;next &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"SELECT&nbsp;`File`,&nbsp;`FileName`&nbsp;FROM&nbsp;`File`"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(record) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(StringEndsWith(record.StringData(2),&nbsp;"|"&nbsp;+&nbsp;fileName)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;value&nbsp;=&nbsp;record.StringData(1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close();}function&nbsp;StringEndsWith(str,&nbsp;value){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(str.length&nbsp;<&nbsp;value.length) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(str.indexOf(value,&nbsp;str.length&nbsp;-&nbsp;value.length)&nbsp;!=&nbsp;-1);}我最初是从Aaron Stebner的博客那里得到的,然后修改了它。将该Javascript文件保存到项目目录(与包含.vdproj的目录相同),将其命名ModifyMsiToEnableLaunchApplication.js。对于每个唯一的安装项目,您需要修改该脚本并将正确的exe名称放入其中。然后,您需要在Setup项目中将post-build事件设置为:cscript.exe&nbsp;"$(ProjectDir)ModifyMsiToEnableLaunchApplication.js"&nbsp;"$(BuiltOuputPath)"请务必$(BuiltOuputPath)正确键入宏的名称。这个词Ouput是由微软拼写错误的,并Built没有拼写Build!那应该这样做。另请参阅:此修改不包括UNINSTALL上的“运行Foo.exe”复选框。

一只名叫tom的猫

这似乎是一个更简单的解决方案:&nbsp;Visual Studio Installer>如何在安装程序结束时启动应用程序好!!!这是代码(最后没有2个辅助函数'FindFileIdentifier'和'StringEndsWith' - 使用原始代码),这使我们能够更改控件的Y和高度,以及添加复选框控件可见性条件(参见“NEW - START”到“NEW - END”之间标记的2条评论)://&nbsp;EnableLaunchApplication.js&nbsp;//&nbsp;Performs&nbsp;a&nbsp;post-build&nbsp;fixup&nbsp;of&nbsp;an&nbsp;msi&nbsp;to&nbsp;launch&nbsp;a&nbsp;specific&nbsp;file&nbsp;when&nbsp;the&nbsp;install&nbsp;has&nbsp;completed//&nbsp;Configurable&nbsp;valuesvar&nbsp;checkboxChecked&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Is&nbsp;the&nbsp;checkbox&nbsp;on&nbsp;the&nbsp;finished&nbsp;dialog&nbsp;checked&nbsp;by&nbsp;default?var&nbsp;checkboxText&nbsp;=&nbsp;"Launch&nbsp;[ProductName]?";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Text&nbsp;for&nbsp;the&nbsp;checkbox&nbsp;on&nbsp;the&nbsp;finished&nbsp;dialogvar&nbsp;filename&nbsp;=&nbsp;"*.exe";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;The&nbsp;name&nbsp;of&nbsp;the&nbsp;executable&nbsp;to&nbsp;launch&nbsp;-&nbsp;change&nbsp;*&nbsp;to&nbsp;match&nbsp;the&nbsp;file&nbsp;name&nbsp;you&nbsp;want&nbsp;to&nbsp;launch&nbsp;at&nbsp;the&nbsp;end&nbsp;of&nbsp;your&nbsp;setup//&nbsp;Constant&nbsp;values&nbsp;from&nbsp;Windows&nbsp;Installervar&nbsp;msiOpenDatabaseModeTransact&nbsp;=&nbsp;1;var&nbsp;msiViewModifyInsert&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1var&nbsp;msiViewModifyUpdate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;2var&nbsp;msiViewModifyAssign&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;3var&nbsp;msiViewModifyReplace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;4var&nbsp;msiViewModifyDelete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;6if&nbsp;(WScript.Arguments.Length&nbsp;!=&nbsp;1){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.StdErr.WriteLine(WScript.ScriptName&nbsp;+&nbsp;"&nbsp;file"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Quit(1);}var&nbsp;filespec&nbsp;=&nbsp;WScript.Arguments(0);var&nbsp;installer&nbsp;=&nbsp;WScript.CreateObject("WindowsInstaller.Installer");var&nbsp;database&nbsp;=&nbsp;installer.OpenDatabase(filespec,&nbsp;msiOpenDatabaseModeTransact);var&nbsp;sqlvar&nbsp;viewvar&nbsp;recordtry{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;fileId&nbsp;=&nbsp;FindFileIdentifier(database,&nbsp;filename); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!fileId) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;"Unable&nbsp;to&nbsp;find&nbsp;'"&nbsp;+&nbsp;filename&nbsp;+&nbsp;"'&nbsp;in&nbsp;File&nbsp;table"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;Control&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Modify&nbsp;the&nbsp;Control_Next&nbsp;of&nbsp;BannerBmp&nbsp;control&nbsp;to&nbsp;point&nbsp;to&nbsp;the&nbsp;new&nbsp;CheckBox &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"SELECT&nbsp;`Dialog_`,&nbsp;`Control`,&nbsp;`Type`,&nbsp;`X`,&nbsp;`Y`,&nbsp;`Width`,&nbsp;`Height`,&nbsp;`Attributes`,&nbsp;`Property`,&nbsp;`Text`,&nbsp;`Control_Next`,&nbsp;`Help`&nbsp;FROM&nbsp;`Control`&nbsp;WHERE&nbsp;`Dialog_`='FinishedForm'&nbsp;AND&nbsp;`Control`='BannerBmp'"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.StringData(11)&nbsp;=&nbsp;"CheckboxLaunch"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Modify(msiViewModifyReplace,&nbsp;record); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;NEW&nbsp;-&nbsp;START &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Insert&nbsp;the&nbsp;new&nbsp;CheckBox&nbsp;control &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;I&nbsp;changed&nbsp;the&nbsp;value&nbsp;for&nbsp;Y&nbsp;below&nbsp;from&nbsp;201&nbsp;to&nbsp;191&nbsp;in&nbsp;order&nbsp;to&nbsp;make&nbsp;the&nbsp;checkbox&nbsp;more&nbsp;obvious&nbsp;to&nbsp;the&nbsp;user's&nbsp;eye.&nbsp;In&nbsp;order&nbsp;to&nbsp;do&nbsp;so,&nbsp;and&nbsp;avoid&nbsp;the&nbsp;controls&nbsp;'BodyText'&nbsp;&&nbsp;'BodyTextRemove'&nbsp;in&nbsp;the&nbsp;same&nbsp;form&nbsp;to &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;overlap&nbsp;the&nbsp;checkbox,&nbsp;I&nbsp;added&nbsp;yet&nbsp;2&nbsp;more&nbsp;sql&nbsp;statements&nbsp;that&nbsp;change&nbsp;the&nbsp;values&nbsp;of&nbsp;the&nbsp;heights&nbsp;for&nbsp;the&nbsp;'BodyText'&nbsp;&&nbsp;'BodyTextRemove'&nbsp;from&nbsp;138&nbsp;to&nbsp;128.&nbsp;This&nbsp;way&nbsp;I&nbsp;can&nbsp;play&nbsp;around&nbsp;with&nbsp;the&nbsp;values&nbsp;without&nbsp;using &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;Orca&nbsp;msi&nbsp;editor. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;CheckBoxY&nbsp;=&nbsp;191;&nbsp;//This&nbsp;was&nbsp;initially&nbsp;set&nbsp;to&nbsp;201 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;NewHeight&nbsp;=&nbsp;128;&nbsp;//This&nbsp;was&nbsp;initially&nbsp;set&nbsp;to&nbsp;138 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`Control`&nbsp;(`Dialog_`,&nbsp;`Control`,&nbsp;`Type`,&nbsp;`X`,&nbsp;`Y`,&nbsp;`Width`,&nbsp;`Height`,&nbsp;`Attributes`,&nbsp;`Property`,&nbsp;`Text`,&nbsp;`Control_Next`,&nbsp;`Help`)&nbsp;VALUES&nbsp;('FinishedForm',&nbsp;'CheckboxLaunch',&nbsp;'CheckBox',&nbsp;'9',&nbsp;'"&nbsp;+&nbsp;CheckBoxY&nbsp;+&nbsp;"',&nbsp;'343',&nbsp;'12',&nbsp;'3',&nbsp;'LAUNCHAPP',&nbsp;'{\\VSI_MS_Sans_Serif13.0_0_0}"&nbsp;+&nbsp;checkboxText&nbsp;+&nbsp;"',&nbsp;'CloseButton',&nbsp;'|')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"Select&nbsp;`Dialog_`,&nbsp;`Control`,&nbsp;`Type`,&nbsp;`X`,&nbsp;`Y`,&nbsp;`Width`,&nbsp;`Height`,&nbsp;`Attributes`,&nbsp;`Property`,&nbsp;`Text`,&nbsp;`Control_Next`,&nbsp;`Help`&nbsp;FROM&nbsp;`Control`&nbsp;WHERE&nbsp;`Dialog_`&nbsp;=&nbsp;'FinishedForm'&nbsp;AND&nbsp;`Control`&nbsp;=&nbsp;'BodyText'"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.IntegerData(7)&nbsp;=&nbsp;NewHeight; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Modify(msiViewModifyReplace,&nbsp;record); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"Select&nbsp;`Dialog_`,&nbsp;`Control`,&nbsp;`Type`,&nbsp;`X`,&nbsp;`Y`,&nbsp;`Width`,&nbsp;`Height`,&nbsp;`Attributes`,&nbsp;`Property`,&nbsp;`Text`,&nbsp;`Control_Next`,&nbsp;`Help`&nbsp;FROM&nbsp;`Control`&nbsp;WHERE&nbsp;`Dialog_`&nbsp;=&nbsp;'FinishedForm'&nbsp;AND&nbsp;`Control`&nbsp;=&nbsp;'BodyTextRemove'"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.IntegerData(7)&nbsp;=&nbsp;NewHeight; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Modify(msiViewModifyReplace,&nbsp;record); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;NEW&nbsp;-&nbsp;END &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;ControlEvent&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Modify&nbsp;the&nbsp;Order&nbsp;of&nbsp;the&nbsp;EndDialog&nbsp;event&nbsp;of&nbsp;the&nbsp;FinishedForm&nbsp;to&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"SELECT&nbsp;`Dialog_`,&nbsp;`Control_`,&nbsp;`Event`,&nbsp;`Argument`,&nbsp;`Condition`,&nbsp;`Ordering`&nbsp;FROM&nbsp;`ControlEvent`&nbsp;WHERE&nbsp;`Dialog_`='FinishedForm'&nbsp;AND&nbsp;`Event`='EndDialog'"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record&nbsp;=&nbsp;view.Fetch(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record.IntegerData(6)&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Modify(msiViewModifyReplace,&nbsp;record); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Insert&nbsp;the&nbsp;Event&nbsp;to&nbsp;launch&nbsp;the&nbsp;application &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`ControlEvent`&nbsp;(`Dialog_`,&nbsp;`Control_`,&nbsp;`Event`,&nbsp;`Argument`,&nbsp;`Condition`,&nbsp;`Ordering`)&nbsp;VALUES&nbsp;('FinishedForm',&nbsp;'CloseButton',&nbsp;'DoAction',&nbsp;'VSDCA_Launch',&nbsp;'LAUNCHAPP=1',&nbsp;'0')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;CustomAction&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Insert&nbsp;the&nbsp;custom&nbsp;action&nbsp;to&nbsp;launch&nbsp;the&nbsp;application&nbsp;when&nbsp;finished &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`CustomAction`&nbsp;(`Action`,&nbsp;`Type`,&nbsp;`Source`,&nbsp;`Target`)&nbsp;VALUES&nbsp;('VSDCA_Launch',&nbsp;'210',&nbsp;'"&nbsp;+&nbsp;fileId&nbsp;+&nbsp;"',&nbsp;'')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(checkboxChecked) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;Property&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;the&nbsp;default&nbsp;value&nbsp;of&nbsp;the&nbsp;CheckBox &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`Property`&nbsp;(`Property`,&nbsp;`Value`)&nbsp;VALUES&nbsp;('LAUNCHAPP',&nbsp;'1')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;NEW&nbsp;-&nbsp;START &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("Updating&nbsp;the&nbsp;ControlCondition&nbsp;table..."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Insert&nbsp;the&nbsp;conditions&nbsp;where&nbsp;the&nbsp;Launch&nbsp;Application&nbsp;Checkbox&nbsp;appears &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`ControlCondition`&nbsp;(`Dialog_`,&nbsp;`Control_`,&nbsp;`Action`,&nbsp;`Condition`)&nbsp;VALUES&nbsp;('FinishedForm',&nbsp;'CheckboxLaunch',&nbsp;'Show',&nbsp;'REMOVE=\"\"')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;"INSERT&nbsp;INTO&nbsp;`ControlCondition`&nbsp;(`Dialog_`,&nbsp;`Control_`,&nbsp;`Action`,&nbsp;`Condition`)&nbsp;VALUES&nbsp;('FinishedForm',&nbsp;'CheckboxLaunch',&nbsp;'Hide',&nbsp;'REMOVE<>\"\"')"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;=&nbsp;database.OpenView(sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//NEW&nbsp;-&nbsp;END &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;database.Commit();}catch(e){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.StdErr.WriteLine(e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Quit(1);}
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答