2

インストールされた製品を開くMSIインストールの最後にチェックボックスを追加するソリューションに従っています:
msiインストール後にexeを実行しますか?

ここまでは順調ですね。ただし、リリース ノートを含む単純なテキスト ファイルを開くチェック ボックスをもう 1 つ追加したいと思います。このファイルは、メイン出力とともにセットアップ プロジェクトに既に含まれています。新しいチェックボックスを追加できました。唯一の問題は、そのテキスト ファイルを開く方法です。ここで確認できるように、このニーズに適合するカスタム アクションはないようです 。 .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」プロパティを使用してカスタム アクションを追加しようとしましたが、ファイルに互換性がないため拒否されました。

4

1 に答える 1

0

以下はすべて未確認です。

カスタム アクション タイプ 34msidbCustomActionTypeAsync + msidbCustomActionTypeContinueで ASync/NoWait を実行する必要があると思います。したがって、カスタム アクション タイプは 34+192=226 です。

Sourceドキュメントによると、ターゲットの実行可能ファイルと同じディレクトリである必要はありません。

Targetは...

CustomAction テーブルの Target 列には、実行可能ファイルの完全なパスと名前が含まれ、その後に実行可能ファイルへのオプションの引数が続きます。実行可能ファイルへの絶対パスと名前が必要です。長いファイル名またはパスは引用符で囲む必要があります。値は書式設定されたテキストとして扱われ、プロパティ、ファイル、ディレクトリ、またはその他の書式設定されたテキスト属性への参照が含まれる場合があります。

「start」シェル コマンドを使用して、シェルを使用してテキスト ファイルをロードできます。これにより、ユーザーのデフォルトのテキスト ファイル ビューアを使用してテキスト ファイルが開きます。start.exe へのフル パスとリリース ノートへのフル パスが必要です。Targetドキュメントがフィールドで文字列置換を行うと言っていることに注意してください。テーブル キーが指定されたファイルへのフル パスを取得するための文字列形式があります。File

[#filekey] の形式の部分文字列が見つかった場合は、ファイル テーブルへのキーとして使用される値 filekey を使用して、ファイルのフル パスに置き換えられます。

すべてをまとめると、次のように動作する可能性がありますTarget

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

とはいえ、これらのカスタム アクションをさらに行う場合は、 Wixを調べて独自のカスタム アクションを作成することをお勧めします。Wix を使用すると、この JavaScript ポスト ビルドを実行する必要がなくなります。独自のカスタム アクションを作成すると、.NET または Windows API に直接アクセスできます。たとえば、C# でシェルを使用してファイルを開くのは非常に簡単です

于 2013-04-18T04:08:54.537 に答える