2009-11-23 3 views
2

Javascript 사용자 지정 작업이 실패하는 이유를 파악하는 데 어려움을 겪고 있습니다.Javascript로 구현 된 MSI 사용자 지정 동작을 디버깅하는 방법?

디버깅시 WIX.chm 파일에서 주제를 본 것으로 생각했습니다. 지금 나는 그것을 발견 할 수 없다.

Q1
자바 스크립트 나 VBScript를 사용자 지정 작업을 디버깅하는 방법에 대한 문서가있다?

Q2
는 사용자 지정 작업에서 MSI 로그에 뭔가를 방출 할 수있는 방법이 있습니까?


부록 :
Some people think script is the wrong tool for writing CAs.
동의하지 않습니다. 나는 Javascript is a very good tool for the job라고 생각합니다.

답변

5

doc의 경우 Session.Message을 찾으십시오.

는 자바 스크립트 지정 작업에서 MSI 로그에 메시지를 방출하려면이 상용구 코드 따르

// 
// 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

을 나는 LogException 방법에 예외가 - 더 구체적으로 record.StringData (0) 라인. Microsoft JScript 런타임 오류 : Object expected 134 행 3 열 null이 아닌 레코드를 검사했지만이 줄에서 여전히 실패합니다. 어떤 생각? – tronda

+1

MSI 내에서 스크립트를 실행하고 있습니까? 그렇다면'msiexec/i MYMSI.msi/l * v msilog.txt'를 실행하여 생성 할 수있는 MSI 로그를 확인하십시오. 로그는 msilog.txt에 저장됩니다. decimalToHexString 함수가 누락 된 것 같습니다. 방금 위에 추가했습니다. – Cheeso

+0

위의 매우 유용한 답변을 게시 해 주셔서 감사합니다. 진입 점 함수 (여기서는 MyCustomActionInJavascript)에 대한 명시 적 참조는 MSI 파일에서 작성해야합니다. WiX를 사용할 때 JScriptCall 속성을 진입 점 함수의 이름으로 설정해야합니다. 이것은 사소한 것처럼 보일지 모르지만 나는 이것으로 두 시간을 낭비했다 ... – YitzikC

관련 문제