Visual studio 在msi安装后运行exe?

Visual studio 在msi安装后运行exe?,visual-studio,visual-studio-2008,windows-installer,setup-project,custom-action,Visual Studio,Visual Studio 2008,Windows Installer,Setup Project,Custom Action,使用VisualStudio2008创建msi,以使用安装项目部署我的程序。我需要知道如何使msi运行刚刚安装的exe。自定义操作?如果是,请说明地点/方式。谢谢。是的。。我会编写一个自定义操作,并将其粘贴在InstallExecutionSequence表的末尾这是一个常见的问题。我不只是用一个自定义的动作。我知道的唯一方法是在生成.msi后修改它。我运行一个Javascript脚本作为构建后事件来实现这一点。它会在安装程序向导中插入一个新对话框,其中有一个复选框,上面写着“启动应用程序Foo

使用VisualStudio2008创建msi,以使用安装项目部署我的程序。我需要知道如何使msi运行刚刚安装的exe。自定义操作?如果是,请说明地点/方式。谢谢。

是的。。我会编写一个自定义操作,并将其粘贴在InstallExecutionSequence表的末尾

这是一个常见的问题。我不只是用一个自定义的动作。我知道的唯一方法是在生成.msi后修改它。我运行一个Javascript脚本作为构建后事件来实现这一点。它会在安装程序向导中插入一个新对话框,其中有一个复选框,上面写着“启动应用程序Foo?”。如果选中复选框,则会有一个自定义操作来运行应用程序

它显示为安装向导序列中的最后一个屏幕。看起来像这样:


这是我用来修改MSI的脚本:

//EnableLaunchApplication.js
//执行msi的构建后修复,以在安装完成时启动特定文件
//可配置值
var checkboxChecked=true;//默认情况下是否选中“完成”对话框上的复选框?
var checkboxText=“启动[ProductName]”;//完成对话框上复选框的文本
var filename=“WindowsApplication1.exe”;//要启动的可执行文件的名称-更改此名称以匹配安装结束时要启动的文件
//Windows Installer中的常量值
var msiOpenDatabaseModeTransact=1;
var msiViewModifyInsert=1;
var msiViewModifyUpdate=2;
变量msiViewModifyAssign=3;
变量msiViewModifyReplace=4;
var msiViewModifyDelete=6;
if(WScript.Arguments.Length!=1)
{
WScript.StdErr.WriteLine(WScript.ScriptName+“文件”);
WScript.Quit(1);
}
var filespec=WScript.Arguments(0);
var installer=WScript.CreateObject(“WindowsInstaller.installer”);
var database=installer.OpenDatabase(filespec,msiOpenDatabaseModeTransact);
var-sql;
var观点;
var记录;
尝试
{
var fileId=FindFileIdentifier(数据库,文件名);
如果(!fileId)
在文件表中抛出“找不到“+”文件名“+”;
Echo(“更新控制表…”);
//修改BannerBmp控件旁边的控件_,以指向新复选框
sql=“选择`Dialog`、`Control`、`Type`、`X`、`Y`、`Width`、`Height`、`Attributes`、`Property`、`Text`、`Control`u Next`、`Help`来自`Control`其中`Dialog`=`FinishedForm`和`Control`='BannerBmp';
视图=数据库.OpenView(sql);
view.Execute();
record=view.Fetch();
record.StringData(11)=“CheckboxLaunch”;
查看.修改(msiViewModifyReplace,记录);
view.Close();
//插入新的复选框控件
sql=“插入到`Control`(`Dialog`、`Control`、`Type`、`X`、`Y`、`Width`、`Height`、`Attributes`、`Property`、`Text`、`Control_Next`、`Help`)值(`FinishedForm`、`CheckboxLaunch`、`CheckboxLaunch`、`9`、`201`、`343`、`X`、`3`、`LAUNCHAPP`、`VSI\u MS\u Sans\u Serif13.0\u 0}、`checkboxText+`、`CloseButton`、`124')”)”);
视图=数据库.OpenView(sql);
view.Execute();
view.Close();
Echo(“更新ControlEvent表…”);
//将FinishedForm的EndDialog事件的顺序修改为1
sql=“从`ControlEvent`中选择`Dialog`、`Control`、`Event`、`Argument`、`Condition`、`Ordering`,其中`Dialog`='FinishedForm'和`Event`='EndDialog'”;
视图=数据库.OpenView(sql);
view.Execute();
record=view.Fetch();
记录。整数数据(6)=1;
查看.修改(msiViewModifyReplace,记录);
view.Close();
//插入事件以启动应用程序
sql=“插入到`ControlEvent`(`Dialog`、`Control`、`Event`、`Argument`、`Condition`、`Ordering`)值中('FinishedForm'、'CloseButton'、'DoAction'、'VSDCA_Launch'、'LAUNCHAPP=1'、'0');
视图=数据库.OpenView(sql);
view.Execute();
view.Close();
Echo(“更新CustomAction表…”);
//插入自定义操作以在完成时启动应用程序
sql=“插入到`CustomAction`(`Action`、`Type`、`Source`、`Target`)值('VSDCA_Launch','210','“+fileId+”,'');
视图=数据库.OpenView(sql);
view.Execute();
view.Close();
如果(复选框已选中)
{
Echo(“更新属性表…”);
//设置复选框的默认值
sql=“插入'Property'('Property','Value`)值('LAUNCHAPP','1')”;
视图=数据库.OpenView(sql);
view.Execute();
view.Close();
}
Commit();
}
捕获(e)
{
WScript.StdErr.WriteLine(e);
WScript.Quit(1);
}
函数FindFileIdentifier(数据库,文件名)
{
//首先,尝试查找确切的文件名
var sql=“从`File`中选择`File`,其中`FileName`='+FileName+”;
var view=database.OpenView(sql);
view.Execute();
var record=view.Fetch();
如果(记录)
{
var值=记录.StringData(1);
view.Close();
返回值;
}
view.Close();
//该文件可能是SFN | LFN格式。接下来在本例中查找文件名
sql=“从“文件”中选择“文件”和“文件名”;
视图=数据库.OpenView(sql);
view.Execute();
record=view.Fetch();
while(记录)
{
if(StringEndsWith(record.StringData(2),“|”+文件名))
{
var值=记录.StringData(1);
view.Close();
返回值;
}
record=view.Fetch();
}
view.Close();
}
函数StringEndsWith(str,value)
{
if(str.le
cscript.exe "$(ProjectDir)ModifyMsiToEnableLaunchApplication.js" "$(BuiltOuputPath)"
cscript.exe \"$(ProjectDir)ModifyMsiToEnableLaunchApplication.js\" \"$(BuiltOuputPath)\"
cscript.exe "$(ProjectDir)ModifyMsiToEnableLaunchApplication.js" "$(BuiltOuputPath)"
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', '|')";
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',
   '|')";