VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2004/03/22(Mon) 15:41
投稿者morimori
URL
タイトルRe: DeveceIoControl()について

morimoriです。

K.J.KさんのアドバイスをいただいてDDKをインストールしてこれを参考にしながら各処理を行っている
ところですが、1点わからない点がでてきたため、投稿させていただきます。
現在、「DeviceIoControl()」を使用してメディアのフォーマットを行おうと思っているのですが、エラ
ーとなります。GetLastError()でエラー情報を見るとエラーコード「24」(コマンドの長さが正しくない)
が返ってきます。
対象メディアがスマートメディアのため、制御コードに「IOCTL_DISK_VERIFY」を設定しているのですが
、このコードの構造体パラメーターの設定がおかしいようです。
パラメータには
 ・ディスク範囲の開始オフセットの指定(8Byte)
 ・ディスク範囲のバイト単位の長さ(4Byte)
を指定するようにとMSDNのヘルプには書いてあるのですが、ここの指定方法がわかりません。
現在はメディア情報の取得で、「シリンダ数」「トラック数」「セクタ数」「セクタあたりのバイト数
」は取得しているのでこの値を使用して開始オフセットにシリンダ数を設定し、バイト単位の長さにそれ
以外の値を乗算した値でバイト単位で指定しているのですが、エラーとなります。
下記にソースを公開しますので、ご教授をいただければと思います。
よろしくお願いします。

WindowsXP Pro、VB6.0SP5

【ソース】

'制御コード「IOCTL_DISK_VERIFY」のパラメータ
Public Type VERIFY_INFO
    lngLowerStartingPoint   As Long
    lngUpperStartingPoint   As Long
    lngLength               As Long
End Type

'メディア情報を取得するパラメータ
Public Type MEDIA_INFO
    lngLowerCylinder As Long    'シリンダ数の下位4バイト
    lngUpperCylinder As Long    'シリンダ数の上位4バイト
    lngMediaType As Long        'メディア種別
    lngTrackPerCylinder As Long '1シリンダあたりのトラック数
    lngSectorPerTrack As Long   '1トラックあたりのセクタ数
    lngBytesPerSector As Long   '1セクタあたりのバイトサイズ
End Type

Public gudtMediaInfo As MEDIA_INFO  '


Private Sub MediaFormat(ByVal lngHdl As Long)
    Dim i As Integer
    Dim lngRet As Long
    udtFmt_RM As VERIFY_INFO

    VolumeLock(mlngHdl)     'ボリュームのロック
    GetMediaInfo(lngHdl)    'メディア情報の取得

    udtFmt_RM.lngLength = lngTrackPerCylinder * lngSectorPerTrack * lngBytesPerSector
    For i = 0 To gudtMediaInfo.lngLowerCylinder
        udtFmt_RM.lngLowerStartingPoint = i
        lngRet = DeviceIoControl(lngHdl, lngCtlCode, VarPtr(udtFmt_RM), _
                                        Len(udtFmt_RM), 0&, 0&, lngRetByteCnt, ByVal
0&)
        If lngRet = 0 Then
            lngErrCode = Err.LastDllError
            'Exit For
        End If
    Next i

    VolumeDisMount(lngHdl) 'ボリュームのディスマウント
    VolumeUnLock(lngHdl)   'ボリュームのアンロック
    CloseHandle(lngHdl)    'ハンドルのクローズ

Exit Sub


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -