〜 メディア 〜
CDドライブのトレイを自動的に開けるか調査

現在でもノートパソコンではトレイを自動で閉められるタイプは普通に存在しますが、
トレイを手動でしか開けないタイプのCD/DVDドライブは皆無でしょうから、
「開けるドライブ=CD/DVDドライブ」といっても過言ではないでしょう。
つまり、本来の目的としては「自動的に開けることができるか」を調べるものでありますが、
CD/DVDドライブがどれなのかを調べる方法にも使えるのではないでしょうか?
実際に試してないので本当にイケるかはわかりませんが、
ドライブタイプの取得APIを使わずとも簡易的に知る方法として有効ではないでしょうか?

尚、チェックするには「mci "capability cdaudio can eject"」というように記述しますが、
この記述正常動作するのは、ディスクドライブが1つ、または先頭(若い方)のCDドライブを操作する時で、
仮想ドライブやDVDドライブ等、複数ドライブが並んでいるとうまくいかないことがあります。

任意の、例えばXドライブをチェックするには「mci "capability cdaudio!X can eject"」と記述します。
「!ドライブ名」部分は「!ドライブ名:」や「!ドライブ名:¥¥」としても正常動作します。
サンプルではAドライブを1、Bドライブを2…Zドライブを26としたドライブ番号を指定する形にして、
ドライブ番号が0だと、先頭(若い方)のCD/DVDドライブを指定されたものとして処理する様にしました。
開ける場合、statが、refstrtrueの文字がセットされ、
開けない場合、stat−1がセットされ、refstrには何もセットされません。
	

mcicdcaneject ドライブ番号
ドライブ番号Aドライブを1、Bドライブを2…Zドライブを26として、トレイを開くドライブ番号を指定する。
自動的に開ける場合、statに0が、開けない場合、−1がセットされる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#module
#deffunc mcicdcaneject int
	mref root, 0
	if root : s = "!?:" : poke s, 1, root + 64 : else : s = ""
	mci "capability cdaudio" + s + " can eject"
	return
#global

	sdim drv, 80
	repeat 26, 1
		mcicdcaneject cnt
		if stat = 0 {
			drv += "[?]"
			strlen i, drv
			poke drv, i - 2, cnt + 64
		}
	loop
	pos 10, 10
	if drv = "" {
		mes "CD/DVDドライブは搭載されていません"
	} else {
		mes drv + "ドライブがCD/DVDとして利用できます"
	}
	stop

可否結果 = mcicdcaneject(ドライブ番号)
可否結果トレイを開ける(=0)のか、開けない(=-1)のかの受取先を指定する。
ドライブ番号Aドライブを1、Bドライブを2…Zドライブを26として、トレイを開くドライブ番号を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#module
#defcfunc mcicdcaneject int root, local s
	if root : s = "!?:" : poke s, 1, root + 64 : else : s = ""
	mci "capability cdaudio" + s + " can eject"
	return stat
#global

	sdim drv, 80
	repeat 26, 1
		if mcicdcaneject(cnt) = 0 {
			drv += "[?]"
			poke drv, strlen(drv) - 2, cnt + 64
		}
	loop
	pos 10, 10
	if drv = "" {
		mes "CD/DVDドライブは搭載されていません"
	} else {
		mes drv + "ドライブがCD/DVDとして利用できます"
	}