イベントを使用した進行状況の監視
いくつかのインターフェイスを使用すると、進行状況情報を受信するイベント ハンドラーを実装できます。 たとえば、イベント オブジェクトをデータ ライターにアタッチして、書き込み操作の状態を受け取ることができます。
イベント ハンドラーは、スクリプト内のサブルーチンとして実装されます。 次の例では、サブルーチンを定義し、 WScript.ConnectObject メソッドを使用してイベント ハンドラーを オブジェクトに接続する方法を示します。
' 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
イベント ハンドラー名に指定する名前には、アンダースコア サフィックス ("_") を含める必要があります。 サブルーチン名を形成するには、メソッド名をイベント ハンドラー名に連結します。 たとえば、イベント ハンドラー名として "dataWriterEvent_" を使用し、メソッド名が "Update" の場合、サブルーチン名はdataWriterEvent_Updateされます。
次の例は、イベント ハンドラーを オブジェクトに接続するための別の方法を示しています。
' 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
監視する 2 つ目のバーン デバイスがシステムに含まれている場合は、別の MsftDiscFormat2Data オブジェクトとイベント ハンドラーを作成する必要があります。
次の例は、 ディスク イメージの書き込みの例に 基づいています。 この例では、空白のディスクに ISO イメージを書き込み、イベント ハンドラーを使用して進行状況を更新します。
' 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
関連トピック