先日、PGのリプレースを依頼された。
PGは単純なんだけど、現状FDに出力するファイルをCD-Rに出力して欲しいと。
結構めんどくさいw
単純にCD-RドライブにCOPYって訳にもいかないようだし。
で、定番 ググってみた。
IMAPI2 なるAPIがあるようだ。(対象がWin7でVB2010だったから)
ただほとんどの情報は英語。まあ仕方ない。
無い頭を無理やり使って意訳w
で、出来たのが次のソース。
かなり簡略化してコメントもアバウト。
エラー処理などほぼ無視w
--------------------------------------------------------
参照 COM
IMAPI2
IMAPI2FS
--------------------------------------------------------
'CD-R書込み関連参照設定
Imports IMAPI2
Imports IMAPI2FS
Imports System.Runtime.InteropServices
Module modX
Public Function fncBURNdata() As Boolean
Dim bRet As Boolean = False
Dim sRecorderId As String = String.Empty 'RecorderID
Dim objDiscMaster As IMAPI2.MsftDiscMaster2 = Nothing 'DiscMaster2 Object connects
Dim objRecorder As IMAPI2.MsftDiscRecorder2 = Nothing 'Recorder for BURNing device
Dim DataWriter As IMAPI2.MsftDiscFormat2Data = Nothing '
Dim BurnRet As IMAPI2FS.FileSystemImageResult = Nothing '
Dim Image As IMAPI2FS.MsftFileSystemImage = Nothing '
Dim ImageStreem As IMAPI2.IStream = Nothing '
'CD-R書込み
Try
'デバイス検索
objDiscMaster = New IMAPI2.MsftDiscMaster2
sRecorderId = ""
For Each sDev As String In objDiscMaster
Dim objDev As New IMAPI2.MsftDiscRecorder2
Try
objDev.InitializeDiscRecorder(sDev)
If Trim(objDev.ProductId) = %デバイス名% Then
sRecorderId = sDev
Exit For
End If
Catch ex As Exception
Throw ex
Finally
MarshalObject(objDev)
End Try
Next
'デバイス決定
objRecorder = New IMAPI2.MsftDiscRecorder2
objRecorder.InitializeDiscRecorder(sRecorderId)
'メディア初期化
Dim bRetErase As Boolean = fncEraseDisc(objRecorder)
'ISOイメージ種別指定(Longファイル名使用可能)
Image = New IMAPI2FS.MsftFileSystemImage
Image.FileSystemsToCreate = (FsiFileSystems.FsiFileSystemISO9660 Or
FsiFileSystems.FsiFileSystemJoliet)
'CD-Rボリューム名設定
Image.VolumeName = %ボリューム名%
'ISO作成元フォルダ指定
Image.Root.AddTree(%作成元フォルダパス%, False)
'ISOイメージ作成
DataWriter = New IMAPI2.MsftDiscFormat2Data
DataWriter.Recorder = objRecorder
DataWriter.ClientName = %本PG名%
DataWriter.ForceMediaToBeClosed = True
BurnRet = Image.CreateResultImage()
'ISOイメージ書込み
ImageStreem = DirectCast(BurnRet.ImageStream, IMAPI2.IStream)
DataWriter.Write(ImageStreem)
'メディア取り出し
objRecorder.EjectMedia()
Catch ex As System.Runtime.InteropServices.COMException
'書込みエラー
MsgBox(ex.Message ,
MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation,
"エラー")
bRet = False
Catch ex As Exception
'書込みエラー
MsgBox(ex.Message ,
MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation,
"エラー")
bRet = False
Finally
'各COMオブジェクト開放
MarshalObject(ImageStreem)
MarshalObject(BurnRet)
MarshalObject(DataWriter)
MarshalObject(Image)
MarshalObject(objRecorder)
MarshalObject(objDiscMaster)
End Try
Return bRet
End Function
Private Sub MarshalObject(ByVal obj As Object)
Try
If (Not obj Is Nothing) AndAlso (Marshal.IsComObject(obj)) Then
Marshal.ReleaseComObject(obj)
End If
Catch ex As Exception
Finally
obj = Nothing
End Try
End Sub
Public Function fncEraseDisc(ByVal Recorder As IMAPI2.MsftDiscRecorder2) As Boolean
Dim Format As New IMAPI2.MsftDiscFormat2Erase
Try
Format.Recorder = Recorder
If Not Format.IsCurrentMediaSupported(Recorder) Then
Return False
End If
Format.ClientName = %本PG名%
Format.EraseMedia()
Catch ex As Exception
'ここでのエラーはひとまず無視
Finally
'COMオブジェクト開放
MarshalObject(Format)
End Try
Return True
End Function
End Module
--------------------------------------------------------
そうそうXP等で動かす時はIMAPI2をインストールする必要がある。
Win7は何も必要ないけど
XPだとIMAPI2をMSからダウンロードしてインストールしてね。
%~%は各環境に合わせれば良いと思います^^;
0 件のコメント:
コメントを投稿