2008-09-30 7 views
6

Windows Installer 4.5의 새로운 기능과 WiX를 사용하여 MSI 패키지를 생성합니다.임베디드 UI를 사용하여 임베디드 MSI 패키지 체인을 설치 - 일반 진행률 표시

다른 MSI 패키지 모음을 트랜잭션으로 설치하기 위해 MSI 체인 설치를 만들었습니다. 각 패키지는 새로운 UI가 포함 된 옵션을 사용하므로 UI는 WPF 일 수 있습니다. 이 모든 것이 이제까지 작동합니다.

목표 중 하나는 모든 설치에 대해 일반적인 진행률 막대를 표시하는 것입니다. 현재 체인 설치 프로그램에 진행 표시 줄이 있지만이 패키지는 다른 패키지가 실행되기 전에 100 %에 도달합니다.

나는 게시물을 읽고, Fun with MsiEmbeddedChainer, 내가 원하는 것을 얻을 수 있다고 언급했다. 그러나 나는 그것을 작동시킬 수 없다. 좀 더 자세한 설명과 코드 샘플을 원합니다.

+0

WIX에서 WPF UI 사용에 관한 정보가 있습니까? 포함 된 UI 옵션을 사용하는 방법을 찾고 있었지만 예제가 없습니다. –

답변

5

INSTALLMESSAGE_PROGRESS 메시지를 설치 프로그램에 실행하여 진행률 표시 줄의 상태를 수동으로 제어 할 수 있습니다. 자세한 사항은 여기에서 찾을 수 있습니다 :

특히

http://msdn.microsoft.com/en-us/library/aa370354.aspx

, 당신은 상태 표시 줄을 관리 할 수있는 사용자 지정 작업이 필요합니다 (이 MsiProcessMessage에 적절한 통화를 만들기위한 책임이 무엇 나는 또한 당신이하는 것이 좋습니다. 하위 설치를 생성하는 데 사용할 여기에 내가 생각하고있는 것을 설명하기 위해 일부 의사 코드는 다음과 같습니다.

LONG LaunchSubinstallersCA(MSIHANDLE current_installer) 
{ 
    // Initialize the progress bar range and position 
    MsiProcessMessage(current_installer, reset_message); // see MSDN for details 

    for each (subinstaller in list_of_installers) 
    { 
     launch subinstaller; // see MSDN for details 

     // Update the progress bar to reflect most recent changes 
     MsiProcessMessage(current_installer, increment_message); // see MSDN for details 
    } 

    return (result); 
} 

주요 아래 쪽은 진행 표시 줄이 다소 고르지 방식으로 진행하는 것입니다 당신이 정말로 원하는 경우. 멋지게 만들고 더 매끄럽게 만들려면 기다리는 별도의 "리스너"스레드를 시작할 수 있습니다. 하위 설치 프로그램의 업데이트를 통해 진행률 표시 줄을 더 세분화합니다. 같은 뭔가 :

LONG LaunchSubinstallersCA(MSIHANDLE current_installer) 
{ 
    // Initialize the progress bar range and position 
    MsiProcessMessage(current_installer, reset_message); // see MSDN for details 

    launch_listener_thread(); // launches listener_thread_proc (see below) 

    for each (subinstaller in list_of_installers) 
    { 
     launch subinstaller; // see MSDN for details 
    } 

    tell_listener_thread_to_stop(); 
    optionally_wait_for_listener_thread_to_die(); 

    return (result); 
} 

void listener_thread_proc() 
{ 
    // Loop until told to stop 
    while (!time_for_me_to_stop) 
    { 
     // Listen for update from sub-installer 
     timed_wait_for_update(); // probably required IPC, perhaps a named event? 

     // Only update the progress bar if an update message was actually received 
     if (!timeout) 
     { 
      // Update the progress bar to reflect most recent changes 
      MsiProcessMessage(current_installer, increment_message); // see MSDN for details 
     } 
    } 
} 

는 물론 각 하위 설치의 진행 상황 설치 메인 신호를 할 수있는 것, 그래서 이것은 잠재적으로 당신의 제품에서보다 광범위한 변화가 필요합니다. 그것이 그 노력의 가치가 있는지 여부는 당신에게 달렸습니다.