Visual studio 2010 MSI安装后打开文本文件

Visual studio 2010 MSI安装后打开文本文件,visual-studio-2010,windows-installer,setup-project,custom-action,Visual Studio 2010,Windows Installer,Setup Project,Custom Action,我一直在遵循一种解决方案,在MSI安装结束时添加一个复选框,以打开已安装的产品: 到目前为止,一切顺利。 但是,我想添加另一个复选框,该复选框打开一个包含发行说明的简单文本文件。该文件已与主输出一起包含在安装项目中。我可以添加一个新的复选框。唯一的问题是如何打开该文本文件:正如我在这里看到的,似乎没有任何自定义操作适合此需要: 以下是我当前的JS代码: var sql var view var checkboxTextForReleaseNotes = "See release notes"

我一直在遵循一种解决方案,在MSI安装结束时添加一个复选框,以打开已安装的产品:

到目前为止,一切顺利。 但是,我想添加另一个复选框,该复选框打开一个包含发行说明的简单文本文件。该文件已与主输出一起包含在安装项目中。我可以添加一个新的复选框。唯一的问题是如何打开该文本文件:正如我在这里看到的,似乎没有任何自定义操作适合此需要:

以下是我当前的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”属性添加自定义操作,但由于文件不兼容而被拒绝。

以下所有操作均未经测试

我认为您希望and也异步运行/NoWait。因此,自定义操作类型34+192=226

根据文档,源文件不必与目标可执行文件位于同一目录下

目标

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

可以使用来使用shell加载文本文件。这将使用用户的默认文本文件查看器打开文本文件。您需要start.exe的完整路径和发行说明的完整路径。注意文档如何在
Target
字段中执行字符串替换。要获取文件的完整路径,请指定其
文件
表键

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

综上所述,以下内容可能适用于
Target

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


总而言之,如果你打算做更多的这些定制动作,我会认真研究并创作你自己的定制动作。Wix将使您免于运行此javascript后期构建。通过编写自己的自定义操作,可以直接访问.NET或Windows API。例如,使用C#中的shell打开文件是。

的确,WiX提供了更多的可能性,但为了线程,我将尝试完成这一部分。如果我理解正确,sql查询应该如下所示,但不起作用(但不会弹出错误):
sql=“插入到``CustomAction`(`Action`、`Type`、`Source`、`Target`)值(`OPEN\'RN、`226`、''''.\\'[System]start.exe\\\[\\\\\\\\\\\\'+fileIdForReleaseNotes+]\”)但我不确定源代码:它可以是空的吗?哦,它是[SystemFolder]而不是[System]。我是从你那里得到这些值的。医生说它忽略了来源。也许把[SystemFolder]放在那里,看看它是否会改变一些事情?确保您的fileIdForReleaseNotes是正确的。在Orca中打开.MSI并查看文件表。您需要的是文件列中的值。您可能还会被[#filekey]的这部分文档击中:“[#filekey]的值保持为空,并且在安装程序运行CostInitialize操作、FileCost操作和CostFinalize操作之前不会被路径替换。”甚至显式完整路径也不起作用:我尝试了下面的简单值,但仍然没有打开<代码>。。。值('OPEN\u RN'、'226'、'','C:\\Windows\\notepad.exe\“\'C:\\ReleaseNotes.txt\”)
此外,我还禁用了另一个复选框以防干扰,因此我只使用这个复选框进行测试。