マウントポイントにボリュームをマウントする          <TOP>


SetVolumeMountPoint 指定したマウントポイントにボリュームをマウントする
DeleteVolumeMountPoint 指定したマウントポイントからボリュームをアンマウントする
GetVolumeNameForVolumeMountPoint 一意のボリューム名を返す
DefineDosDevice MS-DOS デバイス名の定義、再定義、削除
QueryDosDevice MS-DOS デバイス名に対する現在のマッピングを取得

 

例では、Dドライブに「MountTest」フォルダを作成しておき、Eドライブ情報をマウント、アンマウントしています。

 

'================================================================
'= マウントポイントにボリュームをマウントする
'=    (SetVolumeMountPoint.bas)
'================================================================
#include "Windows.bi"

' 指定したマウントポイントにボリュームをマウントする
Declare Function Api_SetVolumeMountPoint& Lib "kernel32" Alias "SetVolumeMountPointA" (ByVal lpszVolumeMountPoint$, ByVal lpszVolumeName$)

' 指定したマウントポイントからボリュームをアンマウントする
Declare Function Api_DeleteVolumeMountPoint& Lib "kernel32" Alias "DeleteVolumeMountPointA" (ByVal lpszVolumeMountPoint$)

' 一意のボリューム名を返す
Declare Function Api_GetVolumeNameForVolumeMountPoint& Lib "kernel32" Alias "GetVolumeNameForVolumeMountPointA" (ByVal lpszVolumeMountPoint$, ByVal lpszVolumeName$, ByVal cchBufferLength&)

' MS-DOS デバイス名の定義、再定義、削除
Declare Function Api_DefineDosDevice& Lib "kernel32" Alias "DefineDosDeviceA" (ByVal dwFlags&, ByVal lpDeviceName$, ByVal lpTargetPath$)    

' MS-DOS デバイス名に対する現在のマッピングを取得
Declare Function Api_QueryDosDevice& Lib "kernel32" Alias "QueryDosDeviceA" (ByVal lpDeviceName$, ByVal lpTargetPath$, ByVal ucchMax&)

#define DDD_EXACT_MATCH_ON_REMOVE &H4   'DDD_REMOVE_DEFINITIONと共に指定すると、完全に一致するマッピングから、削除するマッピングを判断
#define DDD_RAW_TARGET_PATH &H1         'lpTargetPathに指定されている文字列は、ドライブパス
#define DDD_REMOVE_DEFINITION &H2       '指定のデバイスの指定された定義を削除

Var Shared Text1 As Object
Var Shared Button1 As Object
Var Shared Button2 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Button2.Attach GetDlgItem("Button2") : Button2.SetFontSize 14

'================================================================
'= CDドライブ『E:』を『D:\MountTest』にマウントする
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var MountPoint As String
    Var VolumeName As String
    Var DeviceName As String
    Var TargetPath As String
    Var DriveLetter As String
    Var NTDevice As String
    Var Ret As Long
   
    'MS-DOS デバイス名に対する現在のマッピングを取得
    DeviceName = "E:"    'CDドライブ
    TargetPath = String$(255, Chr(0))
    Ret = Api_QueryDosDevice(DeviceName, TargetPath, Len(TargetPath))
    TargetPath = Left$(TargetPath, InStr(TargetPath, Chr$(0)) - 1)

    '一時的に仮想ドライブに関連付ける
    DriveLetter = "I:"    '空いてるドライブ指定
    NTDevice = TargetPath
    Ret = Api_DefineDosDevice(DDD_RAW_TARGET_PATH, DriveLetter, NTDevice)

    If Ret Then
        'ボリューム名の取得
        MountPoint = "I:\"
        VolumeName = String$(255, Chr(0))
        Ret = Api_GetVolumeNameForVolumeMountPoint(MountPoint, VolumeName, Len(VolumeName))

        '関連付けの削除
        Ret = Api_DefineDosDevice(DDD_RAW_TARGET_PATH Or DDD_REMOVE_DEFINITION Or DDD_EXACT_MATCH_ON_REMOVE, DriveLetter, NTDevice)
        VolumeName = Left$(VolumeName, InStr(VolumeName, Chr$(0)) - 1)

        'ボリュームのマウント
        MountPoint = "D:\MountTest\"
        Ret = Api_SetVolumeMountPoint(MountPoint, VolumeName)

        If Ret <> 0 Then Text1.SetWindowText "マウント成功しました!" Else Text1.SetWindowText "マウント失敗しました!"
    End If
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var MountPoint As String   'マウントポイント
    Var Ret As Long
   
    MountPoint = "D:\MountTest\"
   
    Ret = Api_DeleteVolumeMountPoint(MountPoint)
   
    If Ret <> 0 Then Text1.SetWindowText "アンマウント成功しました!" Else Text1.SetWindowText "アンマウント失敗しました!"
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End