Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Tindakan Kustom dapat menambahkan informasi tentang waktu dan kemajuan ke kontrol ProgressBar . Untuk informasi selengkapnya tentang membuat kotak dialog tampilan tindakan yang memiliki ProgressBar, lihat Menyusun Kontrol ProgressBar.
Perhatikan bahwa dua tindakan kustom harus ditambahkan ke paket Penginstal 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 ProgressBar kontrol saat alat penginstal menjalankan skrip penginstalan. Tindakan kustom kedua harus merupakan 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
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.
Setiap pembaruan oleh tindakan kustom mengubah panjang ProgressBar dengan kenaikan konstanta. Tentukan atau hitung jumlah tanda centang dalam setiap kenaikan. Biasanya perubahan panjang ProgressBar dari satu tanda 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 tanda dalam setiap kenaikan.
Tentukan atau hitung jumlah total tanda centang yang ditambahkan tindakan kustom ke panjang ProgressBar. 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 harus meningkatkan perkiraan panjang total akhir ProgressBar sebesar 100000 tick.
Nota
Untuk menghitung ini secara dinamis, tindakan kustom harus berisi bagian yang segera dijalankan selama pembuatan skrip. Jumlah centang yang dilaporkan oleh tindakan kustom eksekusi yang ditangguhkan harus sama dengan jumlah centang 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.
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.
Bagian yang berjalan selama pembuatan skrip harus meningkatkan perkiraan panjang total akhir ProgressBar dengan jumlah total tanda dalam aksi kustom. Ini dilakukan dengan mengirim pesan kemajuan ProgressAddition.
Bagian yang berjalan selama fase eksekusi penginstalan harus menyiapkan teks dan templat pesan untuk memberi tahu pengguna tentang apa yang dilakukan tindakan kustom dan untuk mengarahkan alat penginstal dalam memperbarui kendali ProgressBar. Misalnya, beri tahu penginstal untuk memindahkan ProgressBar maju satu langkah dan kirimkan pesan kemajuan yang jelas pada setiap pembaruan. Biasanya ada perulangan di bagian ini jika ada tindakan khusus yang menginstal sesuatu. Dengan setiap loop ini, alat penginstal dapat menginstal satu item referensi seperti kunci registri dan memperbarui kontrol ProgressBar
Tambahkan tindakan kustom eksekusi segera ke paket Pemasang Windows Anda. Tindakan kustom ini memberitahu ProgressBar sejauh mana harus bergerak maju selama fase akuisisi dan pembuatan skrip pada penginstalan. Untuk sampel berikut, sumbernya adalah DLL yang dibuat dengan mengkompilasi kode sampel dan targetnya adalah titik masuk, CAProgress.
Tambahkan tindakan kustom eksekusi yang ditangguhkan ke paket Pemasang Windows Anda. Tindakan kustom ini menyelesaikan langkah-langkah penginstalan aktual dan menginformasikan ProgressBar berapa banyak untuk memajukan bilah pada saat penginstal menjalankan skrip penginstalan. Untuk sampel berikut, sumbernya adalah DLL yang dibuat dengan mengkompilasi kode sampel dan targetnya adalah titik masuk, CAProgress.
Jadwalkan tindakan kustom antara InstallInitialize dan InstallFinalize dalam tabel InstallExecuteSequence. Tindakan kustom yang ditangguhkan harus dijadwalkan segera setelah tindakan kustom yang dieksekusi segera. Alat penginstal tidak akan menjalankan tindakan kustom yang ditangguhkan hingga skrip dijalankan.
Contoh berikut menunjukkan bagaimana tindakan kustom dapat ditambahkan ke ProgressBar. Sumber kedua tindakan kustom adalah DLL yang dibuat dengan mengkompilasi kode sampel dan target 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;
}
}