2012-03-22 1 views
2

.Net에서 응용 프로그램을 개발했으며 설치 프로그램이 정상적으로 작동합니다.설치에 응용 프로그램 시작 옵션 (확인란) 추가

이제 완료 버튼을 클릭 한 후 동일한 애플리케이션을 실행하기위한 설치 프로그램의 마지막에 확인란을 추가하는 것과 같은 기능이 추가로 필요합니다.

나는 여기에 주어진 단계를 구현했습니다 : How can I customize an MSI in the Visual Studio setup/deployment project? 그러나 마지막에 체크 박스를 얻을 수 없습니다. JScript의 기존

은 이것이다 :

// EnableLaaunchApplication.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 = "Launch [ProductName]"; // Text for the checkbox on the finished dialog 
    var filename = "FlashApp.exe"; // 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(15) = "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); 
    } 
+0

중복으로 - http://stackoverflow.com/questions/1668274/run-exe-after-msi-installation –

+0

그러나 그것은 나를 위해 작동하지 않습니다 ... 내 질문에 지정했습니다 –

+0

당신이 지적한 곳 ? 왜이게 너를 돕지 않는거야? –

답변

7

당신은 Visual Studio를 설치 프로젝트는 여러 가지면에서 끔찍한 것을 알고 있어야한다. 실제로 Microsoft는 Visual Studio 11에서 Visual Studio 11을 제거하고 사용자에게 제한된 버전의 InstallShield 무료 버전을 사용하도록 권장했습니다. ISLE은 마침 대화 상자에 체크 박스를 추가하여 애플리케이션을 시작하도록 지원합니다. 또 다른 가능성은 Windows Installer XML로 변환하는 것입니다. 그것은 모두 귀하의 필요에 달려 있으며 설치 프로그램을 배우는데 얼마나 많은 시간을 투자하고 싶은가에 달려 있습니다.

Visual Studio 설치 프로젝트는 제한적으로 사용하는 기본 MSI를 숨 깁니다. MSI에 포스트 빌드 SQL 업데이트를 해킹 할 수있는 방법이 있지만 확장이 불가능한 솔루션입니다.

이런 종류의 스크립트는 제 생각에는 쓸데없는 노력입니다. 비유를 사용합시다. .NET 언어의 일부 구현 (Bb라고 부름)을 사용하고 있고 CLR/.NET 기능이 부족하다는 사실을 알게되면 결과 어셈블리에서 IL을 조작하기 위해 포스트 빌드를 사용 하시겠습니까? C#과 같은 더 나은 CLR 언어로 전환하십시오. 그건 같은거야. 결과적인 MSI를 조작하지 말고 더 나은 도구로 전환하십시오.