Monitoraggio dello stato di avanzamento con eventi
Diverse interfacce consentono di implementare un gestore eventi per ricevere informazioni sullo stato di avanzamento. Ad esempio, un oggetto evento può essere associato al writer di dati per ricevere lo stato dell'operazione di scrittura.
Un gestore eventi viene implementato come subroutine in uno script. Nell'esempio seguente viene illustrato come definire la subroutine e usare il metodo WScript.ConnectObject per connettere il gestore eventi all'oggetto .
' 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
Il nome specificato per il nome del gestore eventi deve contenere il suffisso di sottolineatura ("_"). Per formare il nome della subroutine, concatenare il nome del metodo al nome del gestore eventi. Ad esempio, se si usa "dataWriterEvent_" come nome del gestore eventi e il nome del metodo è "Update", il nome della subroutine sarà dataWriterEvent_Update.
Nell'esempio seguente viene illustrato un approccio alternativo alla connessione del gestore eventi all'oggetto .
' 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
Se un sistema contiene un secondo dispositivo masterizzato da monitorare, è necessario creare un altro oggetto MsftDiscFormat2Data e un gestore eventi.
L'esempio seguente si basa sull'esempio Di masterizzazione di un'immagine disco . L'esempio scrive un'immagine ISO in un disco vuoto e usa un gestore eventi per fornire aggiornamenti dello stato di avanzamento.
' 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
Argomenti correlati