安装MSI后打开文本文件

时间:2013-04-17 10:06:41

标签: visual-studio-2010 windows-installer setup-project custom-action

我一直在遵循一个解决方案,在MSI安装结束时添加一个checkBox,打开已安装的产品:
Run exe after msi installation?

到目前为止,这么好。 但是,我想添加另一个复选框,打开一个包含发行说明的简单文本文件。该文件已包含在安装项目中,同时还包含主输出。我可以添加一个新的复选框。唯一的问题是如何打开该文本文件:没有自定义操作似乎符合这种需要,我可以在这里看到: http://msdn.microsoft.com/en-us/library/windows/desktop/aa372048%28v=vs.85%29.aspx

这是我目前的JS代码:

var sql
var view
var checkboxTextForReleaseNotes = "See release notes";
var fileReleaseNotes = "ReleaseNotes.txt";

try
{
    var fileIdForReleaseNotes = FindFileIdentifier(database, fileReleaseNotes);
    if (!fileIdForReleaseNotes)
        throw "Unable to find '" + fileReleaseNotes + "' in File table";

    [ ... some actions to include another control as seen in link above ... ]

    // Insert the new CheckboxReleaseNotes control
    sql = "INSERT INTO `Control` (`Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help`) VALUES ('FinishedForm', 'CheckboxReleaseNotes', 'CheckBox', '18', '140', '343', '12', '3', 'LAUNCH_RN', '{\\VSI_MS_Sans_Serif13.0_0_0}" + checkboxTextForReleaseNotes + "', 'CloseButton', '|')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    // 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 release notes
    sql = "INSERT INTO `ControlEvent` (`Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering`) VALUES ('FinishedForm', 'CloseButton', 'DoAction', 'OPEN_RN', 'LAUNCH_RN=1', '0')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    // Insert the custom action to open the release notes when finished
    sql = "INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) VALUES ('OPEN_RN', '210', '" + fileIdForReleaseNotes + "', '')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    database.Commit();
}
catch (e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}

我知道自定义动作的类型“210”不是正确的...但是有没有?或者我必须通过启动Jscript或VBScript来实现我的方式吗?

编辑:代码结束完成。试图通过“vdproj”属性添加自定义操作,但它拒绝,因为该文件不兼容。

1 个答案:

答案 0 :(得分:0)

以下所有内容均未经测试。

我认为您希望custom action type 34msidbCustomActionTypeAsync + msidbCustomActionTypeContinue运行ASync / NoWait。所以自定义操作类型34 + 192 = 226。

根据文档,

Source不必与目标可执行文件位于同一目录。

Target是......

  

CustomAction表的Target列包含可执行文件的完整路径和名称,后跟可执行文件的可选参数。可执行文件的完整路径和名称是必需的。必须在长文件名或路径周围使用引号。该值被视为格式化文本,可能包含对属性,文件,目录或其他格式化文本属性的引用。

您可以使用"start" shell command使用shell加载文本文件。这将使用用户的默认文本文件查看器打开文本文件。您需要start.exe的完整路径以及发行说明的完整路径。请注意文档如何说它将在Target字段上进行字符串替换。 There's a string format获取给定File表密钥的文件的完整路径。

  

如果找到[#filekey]形式的子字符串,则将其替换为文件的完整路径,其值filekey用作File表中的键。

总而言之,以下内容可能适用于Target

"[SystemFolder]start.exe" "[#someFileKey]"

总而言之,如果您要做更多这些自定义操作,我会真正研究Wix并创作自己的自定义操作。 Wix会避免你运行这个javascript post build。通过编写自己的自定义操作,您可以直接访问.NET或Windows API。例如,在C#中使用shell打开文件是pretty straight forward