Ocena użytkowników: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active

Projekt VS2010 Setup jest bardzo standardowy.
Aby dodać opcję uruchomienia aplikacji po jej zainstalowaniu, należy dokonać zmian w wygenerowanym pliku MSI.

Zmiany dokonywane są w pliku MSI więc skrypt musi być wykonany w PostBuildEvent.

 

Kod skryptu EnableLaunchApplication.js :

// EnableLaunchApplication.js <msi-file>
// Performs a post-build fixup of an msi to launch a specific file when the install has completed


// Configurable values
var checkboxChecked = true;			   // Is the checkbox on the finished dialog checked by default?
var checkboxText = "Your run application prompt";  // Text for the checkbox on the finished dialog
var filename = "Your app file name";	           // The name of the executable to launch - change this to match the file you want to launch at the end of your setup

// Constant values from Windows Installer
var msiOpenDatabaseModeTransact = 1;
var msiViewModifyInsert         = 1
var msiViewModifyUpdate         = 2
var msiViewModifyAssign         = 3
var msiViewModifyReplace        = 4
var msiViewModifyDelete         = 6

if (WScript.Arguments.Length != 1)
{
	WScript.StdErr.WriteLine(WScript.ScriptName + " file");
	WScript.Quit(1);
}

var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sql
var view
var record

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

	//WScript.Echo("Updating the Control table...");
	// Modify the Control_Next of BannerBmp control to point to the new CheckBox
	sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BannerBmp'";
	view = database.OpenView(sql);
	view.Execute();
	record = view.Fetch();
	record.StringData(11) = "CheckboxLaunch";
	view.Modify(msiViewModifyReplace, record);
	view.Close();

	// Resize the BodyText and BodyTextRemove controls to be reasonable
	sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BodyTextRemove'";
	view = database.OpenView(sql);
	view.Execute();
	record = view.Fetch();
	record.IntegerData(7) = 33;
	view.Modify(msiViewModifyReplace, record);
	view.Close();

	sql = "SELECT `Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help` FROM `Control` WHERE `Dialog_`='FinishedForm' AND `Control`='BodyText'";
	view = database.OpenView(sql);
	view.Execute();
	record = view.Fetch();
	record.IntegerData(7) = 33;
	view.Modify(msiViewModifyReplace, record);
	view.Close();

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

	//WScript.Echo("Updating the ControlEvent table...");
	// 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 application
	sql = "INSERT INTO `ControlEvent` (`Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering`) VALUES ('FinishedForm', 'CloseButton', 'DoAction', 'VSDCA_Launch', 'LAUNCHAPP=1', '0')";
	view = database.OpenView(sql);
	view.Execute();
	view.Close();

	//WScript.Echo("Updating the CustomAction table...");
	// Insert the custom action to launch the application when finished
	sql = "INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) VALUES ('VSDCA_Launch', '210', '" + fileId + "', '')";
	view = database.OpenView(sql);
	view.Execute();
	view.Close();

	if (checkboxChecked)
	{
		//WScript.Echo("Updating the Property table...");
		// Set the default value of the CheckBox
		sql = "INSERT INTO `Property` (`Property`, `Value`) VALUES ('LAUNCHAPP', '1')";
		view = database.OpenView(sql);
		view.Execute();
		view.Close();
	}
	database.Commit();
}
catch(e)
{
	WScript.StdErr.WriteLine(e);
	WScript.Quit(1);
}
function FindFileIdentifier(database, fileName) { var sql var view var record // First, try to find the exact file name sql = "SELECT `File` FROM `File` WHERE `FileName`='" + fileName + "'"; view = database.OpenView(sql); view.Execute(); record = view.Fetch(); if (record) { var value = record.StringData(1); view.Close(); return value; } view.Close(); // The file may be in SFN|LFN format. Look for a filename in this case next sql = "SELECT `File`, `FileName` FROM `File`"; view = database.OpenView(sql); view.Execute(); record = view.Fetch(); while (record) { if (StringEndsWith(record.StringData(2), "|" + fileName)) { var value = record.StringData(1); view.Close(); return value; } record = view.Fetch(); } view.Close(); } function StringEndsWith(str, value) { if (str.length < value.length) return false; return (str.indexOf(value, str.length - value.length) != -1); }

 

Wywołanie w projekcie.

Ustawiamy właściwości projektu PostBuildEvent

..\PathToScript\EnableLaunchApplication.js $(BuildOutputPath)

 

Plików:
Enable Launch Application after install 1.0
(0 votes)
Licencja GNU/GPL Data 26-04-2015 15:14:50 System  Windows Wielkość 1.66 KB Download 1 Pobierz

 

 

 

Ocena użytkowników: 4 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Inactive

Visual Studio 2010 Setup Project

Prosty skrypt pozwala na automatyczną numerację wersji instalatora.
Uruchomiony przy wykonaniu PostBuildEvent pozostawia nowy numer wersji instalatora do następnego wydania.

 

Kod skryptu IncrementVersionSetup.js :

/*
 * Standard call: ..\PathToScript\IncrementVersionSetup.js PathToSetupProject\SetupProject.vdproj
 * Data: 2015-04-25
 * Autor: Marek Kosman - http://software.infinitydreams.net
 */

if (WScript.Arguments.Length != 1)
{
	WScript.StdErr.WriteLine(WScript.ScriptName + " no project file");
	WScript.Quit(1);
}

arguments = WScript.Arguments(0);

// read project file and save backup 
fso = WScript.CreateObject("Scripting.FileSystemObject");
f = fso.OpenTextFile(arguments)
s = f.ReadAll();
f.Close();

fbak = arguments + ".bak";
WScript.StdOut.WriteLine( "Saving backup file " + fbak );

if(fso.fileexists(fbak))
	fso.deletefile(fbak);
	
fso.copyfile(arguments, fbak);

// increment product version
re = /(\"ProductVersion\" = \"8:)(\d+(\.\d+)+)\"/
m = re.exec(s);
if( m != null ) 
{
	v = m[2];
	WScript.StdOut.WriteLine(m[0]);
	v1 = v.split(".");
	buildNumerA =  v1[v1.length-1] ;
	buildNumer = parseInt(buildNumerA) + 1;
	v1[v1.length-1] = buildNumer;
	vnew = v1.join(".");
	s = s.replace(re, m[1] + vnew + "\"");	
	m = re.exec(s);	
	WScript.StdOut.WriteLine(m[0]);
}
else 
{
	WScript.StdErr.WriteLine(WScript.ScriptName + " no project file");
	WScript.Quit(1);
}

// replace ProductCode
re = /(\"ProductCode\" = \"8:)(\{.+\})\"/
m = re.exec(s);
if( m != null )
{
	guid = WScript.CreateObject("Scriptlet.TypeLib").Guid;
	guid = guid.substring(0,guid.length - 2);
	WScript.StdOut.WriteLine(m[0] + " - " + guid);
	s = s.replace(re, m[1] + guid + "\"");
}
else 
{
	WScript.StdErr.WriteLine(WScript.ScriptName + " no ProductCode");
	WScript.Quit(1);
}

// replace PackageCode
re = /(\"PackageCode\" = \"8:)(\{.+\})\"/
m = re.exec(s);
if( m != null )
{
	guid = WScript.CreateObject("Scriptlet.TypeLib").Guid;
	guid = guid.substring(0,guid.length - 2);
	WScript.StdOut.WriteLine(m[0] + " - " + guid);
	s = s.replace(re, m[1] + guid + "\"");
}
else 
{
	WScript.StdErr.WriteLine(WScript.ScriptName + " no PackageCode");
	WScript.Quit(1);
}

//write project file
fnew = arguments;
f = fso.CreateTextfile(fnew, true);
f.write(s);
f.close();

 

Wywołanie w projekcie.

Ustawiamy właściwości projektu PostBuildEvent

..\PathToScript\IncrementSetupVersion.js $(ProjectDir)\\DualTaskingSetup.vdproj

 

AutoIncrement Setup project version 0.1
(1 vote)
Licencja GNU/LGPL Data 26-04-2015 10:15:52 Język  Multilanguage System  Windows Wielkość 864 B Download 1 Pobierz

 

 

 

Ocena użytkowników: 0 / 5

Star InactiveStar InactiveStar InactiveStar InactiveStar Inactive

 Skrót bez używania dodatkowego kodu.

  • W projekcie instalatora w oknie File System wybieramy Special Folder i dodajemy System Folder.
  • Do utworzonego folderu dodajemy msiexec.exe znajdujący się w folderze System32.
  • Dla dodanego pliku msiexec.exenależy zmodyfikować właściwości :
    • Condition - NOT INSTALLED,
    • Pernament - TRUE,
    • System - TRUE,
    • Transitive - TRUE,
    • Vital - FALSE.
  • Teraz możemy utworzyć skrót (np. w menu START). Czyli w Users Program Menu wybieramy skrót do System Folder i wskazujemy msiexec.exe, jako argument podajemy :
    • Arguments - /x [ProductCode] (pomiędzy /x a [ProductCode] znajduje się spacja).
  • Pozostaje jeszcze zmienić nazwę utworzonego skrótu.

Teraz możemy zbudować projekt. Będzie ostrzeżenie, ale to można zignorować. Ustawienie właściwości NOT INSTALLED oraz Permananet:TRUE powoduje że msiexec.exe będzie umieszczony w folderze System32 tylko w przypadku gdy go tam nie ma, lub zostanie zaktualizowany do wyższej wersji. Nie zostanie on usunięty przy odinstalowaniu aplikacji.

Ocena użytkowników: 4 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Inactive

Napisaliśmy swój program i bardzo fajnie. Czas go teraz udostępnić ... np. korzystając z VS2010 Setup Project.
Dodajemy więc do projektu Setup, określamy co i gdzie ma trafić ... Instalator gotowy ( ten etap nie jest trudny ).
Drobne poprawki, nowe funkcje ... budujemy Setup ... Instalujemy i wszystko przebiega prawidłowo.
I instalator pomyślnie zakończył działanie - a zmian nie widać.

Temat nie jest skomplikowany. Lekka modyfikacja i mamy gotowe.
Modyfikacja dotyczy zmiany klucza instalatora REINSTALLMODE. Opis poszczególnych flag jest tu , nie powinno być problemów.
Rozwiązania są dwa (a może i więcej można wymyślić).
Co będzie potrzebne ?

Modyfikacja bazowego MSI.

Dotyczy lokalnie budowanych plików instalatora.

  1. Na początek ORCA ( jak nie masz pobranego SDK, zacznij stąd ). Znajdź w katalogu:
    .../Program Files/Microsoft SDKs/Windows/v7.0A/bin/Orca.msi i go zainstaluj.
  2. Edytujemy pliczek z katalogu (jak wyżej) /msitools/Schemas/MSI/Schema.msi
  3. Szukamy zakładki PROPERTY i dodajemy klucz REINSTALMODE z wartością omus
  4. Zapisujemy.. I nasz update zadziała poprawnie.

Modyfikacja pliku wynikowego instalatora.

O ile projekt chcemy, lub wypada trzymać w więcej niż jednym kompie.
Tu temat jest jeszcze prostszy, bo nie trzeba nic ściągać ... wystarczy we właściwościach projektu Setup... umieścić w PostBuildEvents odwołanie do skryptu ....../Scripts/ReinstallMode.js $(BuiltOuputPath) który wygląda tak :

// modify reinstal mode
// Constant values from Windows Installer
var msiOpenDatabaseModeTransact = 1;
var msiViewModifyInsert = 1
var msiViewModifyUpdate = 2
var msiViewModifyAssign = 3
var msiViewModifyReplace = 4
var msiViewModifyDelete = 6


if (WScript.Arguments.Length != 1)
{
    WScript.StdErr.WriteLine(WScript.ScriptName + "file");
    WScript.Quit(1);
}

var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);
var sql
var view
var record

try
{
    WScript.Echo("Updating the Property table... REINSTALLMODE omus");
    sql = "INSERT INTO `Property` (`Property`, `Value`) VALUES ('REINSTALLMODE', 'omus')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();
    database.Commit();
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}

 

 

ReinstallMode 0.1
(0 votes)
Licencja GNU/GPL Data 29-04-2015 16:59:08 Wielkość 581 B Download 0 Pobierz