Surveillance de la progression avec les événements
Plusieurs interfaces vous permettent d’implémenter un gestionnaire d’événements pour recevoir des informations de progression. Par exemple, un objet d’événement peut être attaché à l’enregistreur de données pour recevoir l’état de l’opération d’écriture.
Un gestionnaire d’événements est implémenté en tant que sous-routine dans un script. L’exemple suivant montre comment définir la sous-routine et utiliser la méthode WScript.ConnectObject pour connecter le gestionnaire d’événements à l’objet.
' Create the MsftDiscFormat2Data object (see the IDiscFormat2Data interface).
Set dataWriter = CreateObject ("IMAPI2.MsftDiscFormat2Data")
' Attach event handler (see the DDiscFormat2DataEvents interface).
' The "dwBurnEvent_" parameter identifies the handler (see the
' dwBurnEvent_Update subroutine).
WScript.ConnectObject dataWriter, "dwBurnEvent_"
' Event handler for the MsftDiscFormat2Data.Write method.
' For details of the subroutine's parameters, see the
' DDiscFormat2DataEvents::Update method.
SUB dwBurnEvent_Update( byRef object, byRef progress )
' --- Other code occurs here.
END SUB
Le nom spécifié pour le nom du gestionnaire d’événements doit contenir le suffixe de trait de soulignement (« _ »). Pour former le nom de sous-routine, concaténer le nom de la méthode au nom du gestionnaire d’événements. Par exemple, si vous utilisez « dataWriterEvent_ » comme nom du gestionnaire d’événements et que le nom de la méthode est « Update », le nom de sous-routine est dataWriterEvent_Update.
L’exemple suivant montre une autre approche pour connecter le gestionnaire d’événements à l’objet.
' Create object and connect the event handler in one step.
' Set dataWriter = _
' WScript.CreateObject("IMAPI2.MsftDiscFormat2Data","dwBurnEvent_")
' Event handler
SUB dwBurnEvent_Update( byRef object, byRef progress )
'--- Other code occurs here.
END SUB
Si un système contient un deuxième appareil de brûlure à surveiller, vous devez créer un autre objet MsftDiscFormat2Data et un gestionnaire d’événements.
L’exemple suivant s’appuie sur l’exemple Burn a Disc Image . L’exemple écrit une image ISO dans un disque vide et utilise un gestionnaire d’événements pour donner des mises à jour de progression.
' This script burns data files to disc in a single session
' using files from a single directory tree.
' Copyright (C) Microsoft Corp. 2006
Option Explicit
' *** CD/DVD disc file system types
Const FsiFileSystemISO9660 = 1
Const FsiFileSystemJoliet = 2
Const FsiFileSystemUDF102 = 4
' *** IFormat2Data Write Action Enumerations
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA = 0
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_FORMATTING_MEDIA = 1
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_INITIALIZING_HARDWARE = 2
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_CALIBRATING_POWER = 3
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA = 4
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION = 5
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_COMPLETED = 6
const IMAPI_FORMAT2_DATA_WRITE_ACTION_VERIFYING = 7
WScript.Quit(Main)
Function Main
Dim Index ' Index to recording drive.
Dim Recorder ' Recorder object
Dim Path ' Directory of files to burn
Dim Stream ' Data stream for burning device
Index = 1 ' Second drive on the system
Path = "c:\test\imt\data\2tracks" ' Files to transfer to disc
' Create a DiscMaster2 object to connect to CD/DVD drives.
Dim g_DiscMaster
Set g_DiscMaster = WScript.CreateObject("IMAPI2.MsftDiscMaster2")
' Create a DiscRecorder object for the specified burning device.
Dim uniqueId
set recorder = WScript.CreateObject("IMAPI2.MsftDiscRecorder2")
uniqueId = g_DiscMaster.Item(index)
recorder.InitializeDiscRecorder( uniqueId )
' Create an image stream for a specified directory.
Dim FSI 'Disc file system
Dim Dir 'Root directory of the disc file system
Dim dataWriter
' Create a new file system image and retrieve root directory
Set FSI = CreateObject("IMAPI2FS.MsftFileSystemImage")
Set Dir = FSI.Root
' Define the new disc format and set the recorder
Set dataWriter = CreateObject ("IMAPI2.MsftDiscFormat2Data")
dataWriter.recorder = Recorder
dataWriter.ClientName = "IMAPIv2 TEST"
FSI.FreeMediaBlocks = dataWriter.FreeSectorsOnMedia
FSI.FileSystemsToCreate = FsiFileSystemISO9660
' Add the directory and its contents to the file system
Dir.AddTree Path, false
' Create an image from the file system
Dim result
Set result = FSI.CreateResultImage()
Stream = result.ImageStream
' Attach event handler to the data writing object.
WScript.ConnectObject dataWriter, "dwBurnEvent_"
' Specify the recorder and write the stream to disc.
WScript.Echo "Writing content to disc..."
dataWriter.write(Stream)
WScript.Echo "----- Finished writing content -----"
Main = 0
End Function
' Event handler - Progress updates when writing data
SUB dwBurnEvent_Update( byRef object, byRef progress )
DIM strTimeStatus
strTimeStatus = "Time: " & progress.ElapsedTime & _
" / " & progress.TotalTime
SELECT CASE progress.CurrentAction
CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA
WScript.Echo "Validating media " & strTimeStatus
CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_FORMATTING_MEDIA
WScript.Echo "Formatting media " & strTimeStatus
CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_INITIALIZING_HARDWARE
WScript.Echo "Initializing Hardware " & strTimeStatus
CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_CALIBRATING_POWER
WScript.Echo "Calibrating Power (OPC) " & strTimeStatus
CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA
DIM totalSectors, writtenSectors, percentDone
totalSectors = progress.SectorCount
writtenSectors = progress.LastWrittenLba - progress.StartLba
percentDone = FormatPercent(writtenSectors/totalSectors)
WScript.Echo "Progress: " & percentDone & " " & strTimeStatus
CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION
WScript.Echo "Finishing the writing " & strTimeStatus
CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_COMPLETED
WScript.Echo "Completed the burn."
CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_VERIFYING
WScript.Echo "Verifying the data."
CASE ELSE
WScript.Echo "Unknown action: " & progress.CurrentAction
END SELECT
END SUB
Rubriques connexes