2

Я следовал решение добавить CheckBox в конце установки MSI, который открывает установленный продукт:
Run exe after msi installation?Открыть текстовый файл после того, как MSI установки

До сих пор, так хорошо. Однако я хотел бы добавить еще один checkBox, который открывает простой текстовый файл, содержащий примечания к выпуску. Файл уже включен в проект установки вместе с основным выходом. Я могу добавить новый checkbox. Единственная проблема заключается в том, чтобы открыть этот текстовый файл: нет пользовательских действий не кажется, соответствует этой потребности, как я могу увидеть здесь: 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», но он отказывается, потому что файл несовместим.

ответ

0

Все перечисленные ниже не проверены.

Я думаю, что вы хотите custom action type 34, а также msidbCustomActionTypeAsync + msidbCustomActionTypeContinue для запуска ASync/NoWait. Таким образом, пользовательский тип действия 34 + 192 = 226.

Source, согласно документам, не обязательно должен быть тем же самым каталогом, что и целевой исполняемый файл.

Target является ...

Целевой столбец таблицы CustomAction содержит полный путь и имя исполняемого файла, а затем дополнительные аргументы для исполняемого файла. Требуется полный путь и имя исполняемого файла. Котировочные знаки должны использоваться вокруг длинных имен файлов или путей. Значение обрабатывается как форматированный текст и может содержать ссылки на свойства, файлы, каталоги или другие форматированные текстовые атрибуты.

Вы можете использовать "start" shell command для загрузки текстового файла с помощью оболочки. Это откроет текстовый файл, используя средство просмотра текстовых файлов по умолчанию пользователя. Вам нужен полный путь к start.exe и полный путь к заметкам о выпуске. Обратите внимание, как документы говорят, что он будет выполнять замену строк на поле Target. There's a string format, чтобы получить полный путь к файлу с указанием его таблицы File.

Если найдена подстрока формы [#filekey], ее заменяет полный путь к файлу с ключом значения value, который используется как ключ в таблице файлов.

Собираем все вместе, следующее может работать на Target:

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

Это все, как говорится, если вы собираетесь делать больше из этих пользовательских действий я бы на самом деле выглядят в Wix и создайте собственные действия. Wix избавит вас от запуска этой сборки сообщений javascript. Создание собственных пользовательских действий дает вам прямой доступ к .NET или Windows API.Например, открытие файла с оболочкой в ​​C# равно pretty straight forward.

+0

Действительно, WiX предлагает гораздо больше возможностей, но, ради потока, я попытаюсь закончить этот бит. Если я правильно вас понимаю, запрос sql должен быть таким, как показано ниже, но не работает (ошибка не появляется): 'sql =" INSERT INTO '' CustomAction'' ('' Action'', ' 'Type'',' 'Source'',' 'Target'') VALUES ('OPEN_RN', '226', '', '\" [System] start.exe \ "\" [# "+ fileIdForReleaseNotes +" ] \ "')"; ' Я не уверен в источнике, хотя: он может быть пустым? – tjafaas

+0

К сожалению, это [SystemFolder] not [System]. Я получил эти значения из [здесь] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa370905 (v = vs.85) .aspx). Документы говорят, что игнорируют Source. Возможно, вы оставите [SystemFolder] там и посмотрите, не изменит ли это что-то? Убедитесь, что ваш fileIdForReleaseNotes верен. Откройте файл .MSI в Orca и посмотрите таблицу файлов. То, что вы хотите, - это значение в столбце «Файл». –

+0

Вы также можете попасть в эту часть документов для [#filekey]: «Значение [#filekey] остается пустым и не заменяется путём, пока установщик не выполнит действие CostInitialize, действие FileCost и действие CostFinalize «. –

Смежные вопросы