Menambahkan Tindakan Kustom ke Bilah Kemajuan

Tindakan Kustom dapat menambahkan informasi waktu dan kemajuan ke kontrol ProgressBar . Untuk informasi selengkapnya tentang membuat kotak dialog tampilan tindakan yang memiliki Bilah Kemajuan, lihat Menulis Kontrol Bilah Kemajuan.

Perhatikan bahwa dua tindakan kustom harus ditambahkan ke paket Pemasang Windows untuk melaporkan waktu dan informasi kemajuan secara akurat ke ProgressBar. Satu tindakan kustom harus merupakan tindakan kustom yang ditangguhkan. Tindakan kustom ini harus menyelesaikan penginstalan kustom Anda dan mengirim jumlah kenaikan individual ke kontrol ProgressBar saat alat penginstal menjalankan skrip penginstalan. Tindakan kustom kedua harus berupa tindakan kustom eksekusi segera yang menginformasikan ProgressBar berapa banyak tick yang akan ditambahkan ke jumlah total selama fase akuisisi dan pembuatan skrip penginstalan.

Untuk menambahkan tindakan kustom ke Bilah Kemajuan

  1. Tentukan bagaimana tindakan kustom akan menjelaskan kemajuannya. Misalnya, tindakan kustom yang menginstal kunci registri dapat menampilkan pesan kemajuan dan memperbarui ProgressBar setiap kali alat penginstal menulis satu kunci registri.

  2. Setiap pembaruan oleh tindakan kustom mengubah panjang ProgressBar dengan kenaikan konstanta. Tentukan atau hitung jumlah tanda centang di setiap kenaikan. Biasanya perubahan panjang ProgressBar dari satu centang sesuai dengan penginstalan satu byte. Misalnya, jika alat penginstal menginstal sekitar 10000 byte saat menulis satu kunci registri, Anda dapat menentukan bahwa ada 10000 tick dalam kenaikan.

  3. Tentukan atau hitung jumlah total tanda centang yang ditambahkan tindakan kustom ke panjang Bilah Kemajuan. Jumlah tanda centang yang ditambahkan oleh tindakan kustom biasanya dihitung sebagai: (kenaikan centang) x (jumlah item). Misalnya, jika tindakan kustom menulis 10 kunci registri, alat penginstal menginstal sekitar 100000 byte dan alat penginstal oleh karena itu harus meningkatkan perkiraan panjang total akhir ProgressBar sebesar 1000000 tick.

    Catatan

    Untuk menghitung ini secara dinamis, tindakan kustom harus berisi bagian yang segera dijalankan selama pembuatan skrip. Jumlah kutu yang dilaporkan oleh tindakan kustom eksekusi yang ditangguhkan harus sama dengan jumlah kutu yang ditambahkan ke jumlah centang total oleh tindakan eksekusi segera. Jika tidak demikian, waktu yang tersisa seperti yang dilaporkan oleh kontrol teks TimeRemaining tidak akan akurat.

     

  4. Pisahkan tindakan kustom Anda menjadi dua bagian kode: bagian yang berjalan selama fase pembuatan skrip dan bagian yang berjalan selama fase eksekusi penginstalan. Anda dapat melakukan ini menggunakan dua file atau Anda dapat menggunakan satu file dengan mengkondisikan pada mode eksekusi alat penginstal. Sampel berikut menggunakan satu file dan memeriksa status penginstalan. Bagian sampel dikondisikan untuk dijalankan tergantung pada apakah alat penginstal berada dalam fase eksekusi atau pembuatan skrip penginstalan.

  5. Bagian yang berjalan selama pembuatan skrip harus meningkatkan perkiraan panjang total akhir ProgressBar dengan jumlah total tick dalam tindakan kustom. Ini dilakukan dengan mengirim pesan kemajuan ProgressAddition .

  6. Bagian yang berjalan selama fase eksekusi penginstalan harus menyiapkan teks pesan dan templat untuk memberi tahu pengguna tentang apa yang dilakukan tindakan kustom dan untuk mengarahkan alat penginstal tentang memperbarui kontrol ProgressBar . Misalnya, beri tahu penginstal untuk memindahkan ProgressBar ke depan satu kenaikan dan mengirim pesan kemajuan eksplisit dengan setiap pembaruan. Biasanya ada perulangan di bagian ini jika tindakan kustom menginstal sesuatu. Dengan setiap loop melewati perulangan ini, alat penginstal dapat menginstal satu item referensi seperti kunci registri dan memperbarui kontrol ProgressBar

  7. Tambahkan tindakan kustom eksekusi segera ke paket Pemasang Windows Anda. Tindakan kustom ini menginformasikan ProgressBar berapa banyak yang harus dimajukan selama fase akuisisi dan pembuatan skrip penginstalan. Untuk sampel berikut, sumbernya adalah DLL yang dibuat dengan mengkompilasi kode sampel dan targetnya adalah titik masuk, CAProgress.

  8. Tambahkan tindakan kustom eksekusi yang ditangguhkan ke paket Pemasang Windows Anda. Tindakan kustom ini menyelesaikan langkah-langkah penginstalan aktual dan memberi tahu ProgressBar berapa banyak untuk memajukan bilah pada saat alat penginstal menjalankan skrip penginstalan. Untuk sampel berikut, sumbernya adalah DLL yang dibuat dengan mengkompilasi kode sampel dan targetnya adalah titik masuk, CAProgress.

  9. Jadwalkan kedua tindakan kustom antara InstallInitialize dan InstallFinalize dalam tabel InstallExecuteSequence . Tindakan kustom yang ditangguhkan harus dijadwalkan segera setelah tindakan kustom eksekusi segera. Alat penginstal tidak akan menjalankan tindakan kustom yang ditangguhkan hingga skrip dijalankan.

Contoh berikut menunjukkan bagaimana tindakan kustom dapat ditambahkan ke Bilah Kemajuan. Sumber kedua tindakan kustom adalah DLL yang dibuat dengan mengkompilasi kode sampel dan target dari kedua tindakan kustom adalah titik masuk, CAProgress. Sampel ini tidak membuat perubahan aktual pada sistem, tetapi mengoperasikan ProgressBar seolah-olah menginstal 10 item referensi yang masing-masing berukuran sekitar 10.000 byte. Alat penginstal memperbarui pesan dan ProgressBar setiap kali menginstal item referensi.

#include <windows.h>
#include <msiquery.h>
#pragma comment(lib, "msi.lib")

// Specify or calculate the number of ticks in an increment
// to the ProgressBar
const UINT iTickIncrement = 10000;
 
// Specify or calculate the total number of ticks the custom 
// action adds to the length of the ProgressBar
const UINT iNumberItems = 10;
const UINT iTotalTicks = iTickIncrement * iNumberItems;
 
UINT __stdcall CAProgress(MSIHANDLE hInstall)
{
    // Tell the installer to check the installation state and execute
    // the code needed during the rollback, acquisition, or
    // execution phases of the installation.
  
    if (MsiGetMode(hInstall,MSIRUNMODE_SCHEDULED) == TRUE)
    {
        PMSIHANDLE hActionRec = MsiCreateRecord(3);
        PMSIHANDLE hProgressRec = MsiCreateRecord(3);

        // Installer is executing the installation script. Set up a
        // record specifying appropriate templates and text for
        // messages that will inform the user about what the custom
        // action is doing. Tell the installer to use this template and 
        // text in progress messages.
 
        MsiRecordSetString(hActionRec, 1, TEXT("MyCustomAction"));
        MsiRecordSetString(hActionRec, 2, TEXT("Incrementing the Progress Bar..."));
        MsiRecordSetString(hActionRec, 3, TEXT("Incrementing tick [1] of [2]"));
        UINT iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_ACTIONSTART, hActionRec);
        if ((iResult == IDCANCEL))
            return ERROR_INSTALL_USEREXIT;
              
        // Tell the installer to use explicit progress messages.
        MsiRecordSetInteger(hProgressRec, 1, 1);
        MsiRecordSetInteger(hProgressRec, 2, 1);
        MsiRecordSetInteger(hProgressRec, 3, 0);
        iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_PROGRESS, hProgressRec);
        if ((iResult == IDCANCEL))
            return ERROR_INSTALL_USEREXIT;
              
        //Specify that an update of the progress bar's position in
        //this case means to move it forward by one increment.
        MsiRecordSetInteger(hProgressRec, 1, 2);
        MsiRecordSetInteger(hProgressRec, 2, iTickIncrement);
        MsiRecordSetInteger(hProgressRec, 3, 0);
 
        // The following loop sets up the record needed by the action
        // messages and tells the installer to send a message to update
        // the progress bar.

        MsiRecordSetInteger(hActionRec, 2, iTotalTicks);
       
        for( int i = 0; i < iTotalTicks; i+=iTickIncrement)
        {
            MsiRecordSetInteger(hActionRec, 1, i);

            iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_ACTIONDATA, hActionRec);
            if ((iResult == IDCANCEL))
                return ERROR_INSTALL_USEREXIT;
          
            iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_PROGRESS, hProgressRec);
            if ((iResult == IDCANCEL))
                return ERROR_INSTALL_USEREXIT;
   
            //A real custom action would have code here that does a part
            //of the installation. For this sample, code that installs
            //10 registry keys.
            Sleep(1000);
                    
        }
        return ERROR_SUCCESS;
    }
    else
    {
        // Installer is generating the installation script of the
        // custom action.
  
        // Tell the installer to increase the value of the final total
        // length of the progress bar by the total number of ticks in
        // the custom action.
        PMSIHANDLE hProgressRec = MsiCreateRecord(2);

         MsiRecordSetInteger(hProgressRec, 1, 3);
            MsiRecordSetInteger(hProgressRec, 2, iTotalTicks);
        UINT iResult = MsiProcessMessage(hInstall, INSTALLMESSAGE_PROGRESS, hProgressRec);
           if ((iResult == IDCANCEL))
            return ERROR_INSTALL_USEREXIT;     
        return ERROR_SUCCESS;
     }
}