投稿日 | : 2005/07/29(Fri) 02:10 |
投稿者 | : Starfish |
Eメール | : |
URL | : |
タイトル | : FMIFS.DLL の FormatEx API |
フォームに、コマンドボタンとラベルを貼り付けて
========== ここから、フォームモジュール ================
Private Sub Command1_Click()
Dim bytDrive() As Byte
Dim bytFS() As Byte
Dim bytLabel() As Byte
' パラメータの文字列をバイト配列に
bytDrive = "A:\" & Chr(0) ' ドライブ
bytFS = "FAT" & Chr(0) ' ファイルシステムフォーマット
bytLabel = "TEST" & Chr(0) ' ラベル
' 表示をクリア
Label1.Caption = ""
Call FormatEx(bytDrive(0), _
FMIFS_FLOPPY, _
bytFS(0), _
bytLabel(0), _
API_FALSE, _
FMIFS_SizeDefault, _
AddressOf FormatexCallBack)
If gbytResult = 1 Then
MsgBox "フォーマットが完了しました。"
Else
MsgBox "フォーマットが失敗しました。"
End If
End Sub
========== ここから、標準モジュール ================
Option Explicit
' ディスク/ディスケットのフォーマットを行う関数
Public Declare Function FormatEx Lib "FMIFS.DLL" _
(DriveRoot As Any, _
ByVal MediaFlag As Long, _
Format As Any, _
Label As Any, _
ByVal QuickFormat As Long, _
ByVal ClusterSize As Long, _
ByVal Callback As Long) As Long
' MediaFlag
Public Const FMIFS_HARDDISK = &HC
Public Const FMIFS_FLOPPY = &H8
' ClusterSize
Public Const FMIFS_SizeDefault = 0
Public Const FMIFS_Size512 = 512
Public Const FMIFS_Size1K = 1024
Public Const FMIFS_Size2K = 2048
Public Const FMIFS_Size4K = 4096
Public Const FMIFS_Size8K = 8192
Public Const FMIFS_Size16K = 16384
Public Const FMIFS_Size32K = 32768
Public Const FMIFS_Size64K = 65536
Public Const FMIFS_Size128K = 131072
Public Const FMIFS_Size256K = 262144
' Command
Public Const FMIFS_Progress = 0
Public Const FMIFS_DoneWithStructure = 1
Public Const FMIFS_InsufficientRights = 6
Public Const FMIFS_WriteProtected = 7
Public Const FMIFS_Done = 11
Public Const FMIFS_OutPut = 14
Public Const FMIFS_StructureProgress = 15
' メモリーコピー関数
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)
' C言語の、True/False
Public Const API_TRUE = 1 ' VBの True は、-1
Public Const API_FALSE = 0 ' VBの False は、0
' フォーマットの結果
Public gbytResult As Byte
Public Function FormatexCallBack(ByVal lngCommand As Long, ByVal lngSubAction As Long, ByVal
ActionInfo As Long) As Long
Dim lngInfo As Long
Dim bytMessage(256) As Byte
' Command により分岐
Debug.Print lngCommand, lngSubAction, ActionInfo
Select Case lngCommand ' 処理中
Case FMIFS_Progress
Call CopyMemory(lngInfo, ByVal ActionInfo, 4)
Form1.Label1.Caption = CStr(lngInfo) & " パーセント終了しました。"
Form1.Label1.Refresh
Case FMIFS_DoneWithStructure ' FAT初期化完了?
Form1.Label1.Caption = "フォーマットは完了しました。"
Form1.Label1.Refresh
Case FMIFS_InsufficientRights
' ?
Case FMIFS_WriteProtected ' 書込み禁止
Form1.Label1.Caption = "フォーマットできません。このボリュームは書込み禁止です。"
Form1.Label1.Refresh
Case FMIFS_Done ' 完了
' 終了
Call CopyMemory(gbytResult, ByVal ActionInfo, 1)
Case FMIFS_OutPut ' メッセージ出力
' ActionInfo にメッセージがセットされるようですが、発生しないのでとりあえずスキッ
プ。
Case FMIFS_StructureProgress ' FAT初期化中?
Form1.Label1.Caption = "ファイル アロケーション テーブル(FAT)を初期化していま
す。"
Form1.Label1.Refresh
End Select
FormatexCallBack = API_TRUE
End Function