2008-09-30 6 views
6

मैं MSI पैकेज जेनरेट करने के लिए विंडोज इंस्टालर 4.5 नई सुविधाओं और वाईएक्स का उपयोग कर रहा हूं।एक एम्बेडेड यूआई का उपयोग करके प्रत्येक एम्बेडेड एमएसआई पैकेज की एक श्रृंखला स्थापित करें - सामान्य प्रगति पट्टी प्रदर्शित करें

मैंने लेनदेन के रूप में अन्य एमएसआई पैकेजों के संग्रह को स्थापित करने के लिए एक एमएसआई श्रृंखला स्थापना बनाई है। प्रत्येक पैकेज नए एम्बेडेड यूआई विकल्प का उपयोग कर रहा है ताकि यूआई WPF हो। सबकुछ ठीक से काम करता है।

लक्ष्यों में से एक को सभी इंस्टॉलेशन के लिए एक सामान्य प्रगति पट्टी प्रदर्शित करना होगा। इस समय, मेरे पास चेन इंस्टॉलर में प्रगति पट्टी है, लेकिन अन्य संकुल चलाने से पहले यह 100% तक पहुंच जाता है।

मैंने एक पोस्ट पढ़ा है, Fun with MsiEmbeddedChainer, जो बताता है कि जो मैं चाहता हूं वह हासिल किया जा सकता है। लेकिन मैं इसे काम नहीं कर सकता। मुझे कुछ और विस्तृत स्पष्टीकरण और शायद कुछ कोड नमूने चाहिए।

+0

क्या आपके पास WIX के साथ WPF 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 
     } 
    } 
} 

जाहिर प्रत्येक उप-संस्थापक मुख्य संस्थापक जो प्रगति हुई है संकेत करने के लिए सक्षम होने के लिए होता है, तो यह संभावित रूप से आपके उत्पाद भर में अधिक विस्तृत परिवर्तन की आवश्यकता होगी। प्रयास के लायक है या नहीं, आप पर निर्भर है।

संबंधित मुद्दे