2009-11-23 6 views
2

J'ai du mal à comprendre pourquoi mon action Javascript personnalisée échoue. Je pensais avoir vu un sujet dans le fichier WIX.chm sur le débogage; maintenant je ne peux pas le trouver.Comment déboguer une action personnalisée MSI implémentée en Javascript?

Q1
est là doc sur la façon de déboguer des actions personnalisées Javascript ou VBScript?

Q2
est-il un moyen d'émettre quelque chose dans le journal MSI à partir d'une action personnalisée?


Addendum:
Some people think script is the wrong tool for writing CAs.
Je ne suis pas d'accord. Je pense Javascript is a very good tool for the job.

Répondre

5

Pour le document, recherchez Session.Message.

Pour émettre des messages dans le journal MSI à partir d'une action personnalisée Javascript, suivez ce code boilerplate:

// 
// CustomActions.js 
// 
// Template for WIX Custom Actions written in Javascript. 
// 
// 
// Mon, 23 Nov 2009 10:54 
// 
// =================================================================== 


// http://msdn.microsoft.com/en-us/library/sfw6660x(VS.85).aspx 
var Buttons = { 
     OkOnly   : 0, 
     OkCancel   : 1, 
     AbortRetryIgnore : 2, 
     YesNoCancel  : 3 
}; 

var Icons = { 
     Critical   : 16, 
     Question   : 32, 
     Exclamation  : 48, 
     Information  : 64 
}; 

var MsgKind = { 
     Error   : 0x01000000, 
     Warning   : 0x02000000, 
     User    : 0x03000000, 
     Log    : 0x04000000 
}; 

// http://msdn.microsoft.com/en-us/library/aa371254(VS.85).aspx 
var MsiActionStatus = { 
     None    : 0, 
     Ok    : 1, // success 
     Cancel   : 2, 
     Abort   : 3, 
     Retry   : 4, // aka suspend? 
     Ignore   : 5 // skip remaining actions; this is not an error. 
}; 


function MyCustomActionInJavascript() { 
    try { 
     LogMessage("Hello from MyCustomActionInJavascript"); 
     // ...do work here... 
     LogMessage("Goodbye from MyCustomActionInJavascript"); 
    } 
    catch (exc1) { 
     Session.Property("CA_EXCEPTION") = exc1.message ; 
     LogException(exc1); 
     return MsiActionStatus.Abort; 
    } 
    return MsiActionStatus.Ok; 
} 

// Pop a message box. also spool a message into the MSI log, if it is enabled. 
function LogException(exc) { 
    var record = Session.Installer.CreateRecord(0); 
    record.StringData(0) = "CustomAction: Exception: 0x" + decimalToHexString(exc.number) + " : " + exc.message; 
    Session.Message(MsgKind.Error + Icons.Critical + Buttons.btnOkOnly, record); 
} 


// spool an informational message into the MSI log, if it is enabled. 
function LogMessage(msg) { 
    var record = Session.Installer.CreateRecord(0); 
    record.StringData(0) = "CustomAction:: " + msg; 
    Session.Message(MsgKind.Log, record); 
} 


// popup a msgbox 
function AlertUser(msg) { 
    var record = Session.Installer.CreateRecord(0); 
    record.StringData(0) = msg; 
    Session.Message(MsgKind.User + Icons.Information + Buttons.btnOkOnly, record); 
} 

// Format a number as hex. Quantities over 7ffffff will be displayed properly. 
function decimalToHexString(number) { 
    if (number < 0) 
     number = 0xFFFFFFFF + number + 1; 
    return number.toString(16).toUpperCase(); 
} 
+0

Je reçois une exception sur la méthode LogException - plus précisément la ligne record.StringData (0). Il se lit comme suit: Erreur d'exécution Microsoft JScript: Objet attendu Ligne 134, Colonne 3, J'ai vérifié que l'enregistrement n'est pas nul, mais il échoue toujours sur cette ligne. Une idée? – tronda

+1

Courez-vous le script dans le MSI? Si c'est le cas, vérifiez le journal MSI, que vous pouvez produire en exécutant 'msiexec/i MYMSI.msi/l * v msilog.txt'. Le journal est stocké dans msilog.txt. Je suppose que vous pourriez manquer la fonction decimalToHexString. Je viens d'ajouter cela ci-dessus. – Cheeso

+0

Merci Cheeso pour avoir posté la réponse extrêmement utile ci-dessus! Il convient de noter qu'une référence explicite à la fonction de point d'entrée (ici MyCustomActionInJavascript) doit être faite dans le fichier MSI. Lorsque vous utilisez WiX, cela signifie que l'attribut JScriptCall doit être défini sur le nom de la fonction de point d'entrée. Cela peut sembler trivial, mais j'ai perdu quelques heures avec ça ... – YitzikC

Questions connexes