Javascript CustomActions는 너무 쉬우므로 사용하십시오.
사람들은 자바 스크립트가 MSI CustomActions에 사용하기에 잘못된 것이라고 말했다 . 이유 : 디버그하기 어렵고 신뢰할 수 없습니다. 동의하지 않습니다. 디버깅하기가 어렵지 않으며 C ++보다 어렵지 않습니다. 그냥 다릅니다. Javascript에서 CustomActions 작성이 C ++을 사용하는 것보다 훨씬 쉽고 쉽다는 것을 알았습니다. 훨씬 더 빨리. 신뢰할 수있는만큼.
단 하나의 단점이 있습니다. Javascript CustomActions는 Orca를 통해 추출 할 수 있지만 C / C ++ CA는 리버스 엔지니어링이 필요합니다. 설치 관리자의 마법이 지적 재산으로 보호된다고 생각되면 스크립트를 피하는 것이 좋습니다.
스크립트를 사용하는 경우 일부 구조로 시작하면됩니다. 여기 몇 가지를 시작하십시오.
CustomAction을위한 Javascript "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_CA() {
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);
}
// http://msdn.microsoft.com/en-us/library/d5fk67ky(VS.85).aspx
var WindowStyle = {
Hidden : 0,
Minimized : 1,
Maximized : 2
};
// http://msdn.microsoft.com/en-us/library/314cz14s(v=VS.85).aspx
var OpenMode = {
ForReading : 1,
ForWriting : 2,
ForAppending : 8
};
// http://msdn.microsoft.com/en-us/library/a72y2t1c(v=VS.85).aspx
var SpecialFolders = {
WindowsFolder : 0,
SystemFolder : 1,
TemporaryFolder : 2
};
// Run a command via cmd.exe from within the MSI
function RunCmd(command)
{
var wshell = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var tmpdir = fso.GetSpecialFolder(SpecialFolders.TemporaryFolder);
var tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName());
LogMessage("shell.Run("+command+")");
// use cmd.exe to redirect the output
var rc = wshell.Run("%comspec% /c " + command + "> " + tmpFileName, WindowStyle.Hidden, true);
LogMessage("shell.Run rc = " + rc);
// here, optionally parse the output of the command
if (parseOutput) {
var textStream = fso.OpenTextFile(tmpFileName, OpenMode.ForReading);
while (!textStream.AtEndOfStream) {
var oneLine = textStream.ReadLine();
var line = ParseOneLine(oneLine);
...
}
textStream.Close();
}
if (deleteOutput) {
fso.DeleteFile(tmpFileName);
}
return {
rc : rc,
outputfile : (deleteOutput) ? null : tmpFileName
};
}
그런 다음 다음과 같이 사용자 정의 조치를 등록하십시오.
<Fragment>
<Binary Id="IisScript_CA" SourceFile="CustomActions.js" />
<CustomAction Id="CA.MyCustomAction"
BinaryKey="IisScript_CA"
JScriptCall="MyCustomActionInJavascript_CA"
Execute="immediate"
Return="check" />
</Fragmemt>
물론 여러 사용자 지정 동작에 대해 원하는만큼 Javascript 함수를 삽입 할 수 있습니다. 한 예 : Javascript를 사용하여 IIS에서 WMI 쿼리를 수행하고 ISAPI 필터를 설치할 수있는 기존 웹 사이트 목록을 얻었습니다. 그런 다음이 목록을 사용하여 UI 순서에서 나중에 표시되는 목록 상자를 채 웁니다. 모두 매우 쉽습니다.
IIS7에는 IIS 용 WMI 공급자가 없으므로 shell.Run()
appcmd.exe를 호출하여 작업을 수행하는 방법을 사용 했습니다. 쉬운.
관련 질문 : Javascript CustomActions 정보