IMAPIv2 を JScript 5.x で使う
http://www.microsoft.com/technet/scriptcenter/topics/imapi/imapi2-1.mspx にある VBScript を JScript に移植してみてわかったことのメモ。
IMAPI は Image Mastering API - Windows applications | Microsoft Docs にあるように、JScript からの利用は想定されていないので、そう簡単には移植できません。const は JScript 5.x では実装されていないというのはまだ良い方で、For Each を JScript に移植するには、要素の型が何であるかによって移植方法が変わってきます。
コレクションである場合
Enumerator オブジェクトを使います。まずコレクションであるオブジェクトをインスタンス化してから、さらにそれを Enumerator オブジェクトとしてインスタンス化します。
以下は「Opening and Closing the Tray」のコードを JScript に移植したもの。
var objDiscMaster = WScript.CreateObject("IMAPI2.MsftDiscMaster2"); var colDiscMaster = new Enumerator(objDiscMaster); for(; !colDiscMaster.atEnd(); colDiscMaster.moveNext()) { var objRecorder = WScript.CreateObject("IMAPI2.MsftDiscRecorder2"); objRecorder.InitializeDiscRecorder(colDiscMaster.item()); objRecorder.EjectMedia(); WScript.Sleep(5000); objRecorder.CloseTray(); }
コレクションではない場合
for in 文を使います。さらにそれが、SAFEARRAY(英語)である場合には、VBArray オブジェクトとしてインスタンス化し toArray メソッドを使うことで、JScript で扱える配列に変換する必要があります。
IMAPI の場合、SAFEARRAY であるかどうかは、IMAPI Referenceで調べることができます。(例:VolumePathNames)
以下は「Reading Disc Recorder Properties」のコードの一部。
var objDiscMaster = WScript.CreateObject("IMAPI2.MsftDiscMaster2"); var colDiscMaster = new Enumerator(objDiscMaster); for(; !colDiscMaster.atEnd(); colDiscMaster.moveNext()) { var objRecorder = WScript.CreateObject("IMAPI2.MsftDiscRecorder2"); objRecorder.InitializeDiscRecorder(colDiscMaster.item()); var arrVolumePathNames = new VBArray(objRecorder.VolumePathNames).toArray(); for(var strMountPoint in arrVolumePathNames) { WScript.Echo("First Mount Point: " + arrVolumePathNames[strMountPoint]); break; } }
以下が全コードです。
var IMAPI_PROFILE_TYPE_CDROM = 0x8; var IMAPI_PROFILE_TYPE_DVDROM = 0x10; var IMAPI_PROFILE_TYPE_CD_RECORDABLE = 0x9; var IMAPI_PROFILE_TYPE_DVD_PLUS_RW = 0x1A; var objDiscMaster = WScript.CreateObject("IMAPI2.MsftDiscMaster2"); var colDiscMaster = new Enumerator(objDiscMaster); for(; !colDiscMaster.atEnd(); colDiscMaster.moveNext()) { var objRecorder = WScript.CreateObject("IMAPI2.MsftDiscRecorder2"); objRecorder.InitializeDiscRecorder(colDiscMaster.item()); WScript.Echo("Vendor: " + objRecorder.VendorId); WScript.Echo("Product ID: " + objRecorder.ProductId); WScript.Echo("Product Revision: " + objRecorder.ProductRevision); var arrVolumePathNames = new VBArray(objRecorder.VolumePathNames).toArray(); for(var strMountPoint in arrVolumePathNames) { WScript.Echo("First Mount Point: " + arrVolumePathNames[strMountPoint]); break; } var arrSupportedProfiles = new VBArray(objRecorder.SupportedProfiles).toArray(); for(var Profile in arrSupportedProfiles) { switch(arrSupportedProfiles[Profile]) { case IMAPI_PROFILE_TYPE_CDROM: WScript.Echo("CD-ROM"); break; case IMAPI_PROFILE_TYPE_DVDROM: WScript.Echo("DVD-ROM"); break; case IMAPI_PROFILE_TYPE_CD_RECORDABLE: WScript.Echo("CD-R"); break; case IMAPI_PROFILE_TYPE_DVD_PLUS_RW: WScript.Echo("DVD+RW"); break; } } WScript.Echo(""); }