A Better Project@はてなダイアリー(インポート版)

基本的にここは更新されません。詳細はaboutへ。

IMAPIv2 を JScript 5.x で使う

http://www.microsoft.com/technet/scriptcenter/topics/imapi/imapi2-1.mspx にある VBScriptJScript に移植してみてわかったことのメモ。
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("");
}