〜 ファイル 〜
ドライブのタイプを取得 (要KERNEL32.DLL)

最近のパソコンには外付・内臓タイプの機器が複数搭載されており、
リードオンリー・リムーバブルを問わず、メモリ部分を持つ機器にはパソコンからアクセス可能です。
マイコンピュータにある「A〜Z」のいずれかに割り振られたものがソレで、
ゲームではあまり関係ないでしょうが、ツール系ソフトではフロッピードライブを検知する必要があったり、
メディアプレイヤーではCDまたはDVDドライブを検知する必要があったりします。
プログラムで特定の機器がどれに割り当てられているかを知る必要がある時は、
API関数のGetDriveTypeで簡単に調べることが可能となっており、
調べたドライブが未知のタイプか取得エラーならば「DRIVE_UNKNOWN(=0x0000)」、
存在しないなら「DRIVE_NO_ROOT_DIR(=0x0001)」、
SDカード等のメモリなら「DRIVE_REMOVABLE(=0x0002)」、
ディスクから抜けないドライブ(=ハードディスク?)は「DRIVE_FIXED(=0x0003)」、
リモートまたはネットワークドライブは「DRIVE_REMOTE(=0x0004)」、
CDやDVDは「DRIVE_CDROM(=0x0005)」、
RAMドライブは「DRIVE_RAMDISK(=0x0006)」をそれぞれ返すようになっています。
下記のサンプルのようにこれらの数値からタイプを判別し、処理を行うようにしてください。
尚、下記のモジュールではAを1、Bを2…Zを26としたドライブ番号をパラメータに渡すことで、
システム変数statに上記のタイプ番号を、システム変数refstrにドライブ名「A:¥」等が返ります。
	

drivetype ドライブ番号
ドライブ番号Aドライブを1、Bドライブを2…Zドライブを26としたドライブ番号を指定する。
尚、statにドライブタイプ番号が、refstrにドライブ名が返る。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	ll_libload kernel, "kernel32.dll"
	ll_getproc GetDriveType, "GetDriveTypeA", kernel

#module
#deffunc drivetype int
	mref root, 0
	mref stt, 64
	mref s, 65
	s = "?:\\" : poke s, , root + 64
	ll_getptr s : ll_ret prm
	ll_callfunc prm, 1, GetDriveType@
	ll_ret prm : stt = prm
	return
#global

	sdim type, 16, 7
	type = "Unknown", "NoDrive", "Removable", "HardDisk", "NetWorkDrive", "CD/DVD-ROM", "RamDisk"
	repeat 26, 1
		drivetype cnt
		pos (cnt - 1) / 15 * 200 + 50, (cnt - 1) \ 15 * 25 + 10 : mes type.stat
		pos (cnt - 1) / 15 * 200 + 10, (cnt - 1) \ 15 * 25 + 10 : mes refstr
	loop
	stop

ドライブタイプ = drivetype(ドライブ番号)
ドライブタイプ指定ドライブのタイプ番号の受取先を指定する。
尚、システム変数refstrにはドライブ名が返る。
ドライブ番号Aドライブを1、Bドライブを2…Zドライブを26としたドライブ番号を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#uselib "kernel32.dll"
#cfunc global GetDriveType "GetDriveTypeA" str

#module
#defcfunc drivetype int root, local s
	mref s, 65
	s = "?:\\" : poke s, , root + 64
	return GetDriveType(s)
#global

	type = "Unknown", "NoDrive", "Removable", "HardDisk", "NetWorkDrive", "CD/DVD-ROM", "RamDisk"
	repeat 26, 1
		pos (cnt - 1) / 15 * 200 + 50, (cnt - 1) \ 15 * 25 + 10 : mes type.drivetype(cnt)
		pos (cnt - 1) / 15 * 200 + 10, (cnt - 1) \ 15 * 25 + 10 : mes refstr
	loop