複数のCD-ROMドライブがある場合(mciSendString)はどうする?

このQ&Aのポイント
  • 複数のCD-ROMドライブがある場合に接続されているCD-ROMドライブの情報を取得する方法を教えてください。
  • mciSendStringを使用して接続されているCD-ROMドライブの情報を取得する方法について教えてください。
  • 外付けCD-ROMドライブと内蔵CD-ROMドライブを区別せずに、接続されている最も若いドライブ(Q:ドライブ)の情報を取得する方法を教えてください。
回答を見る
  • ベストアンサー

複数のCD-ROMドライブがある場合(mciSendString)はどうする?

複数のCD-ROMドライブがある場合に以下のコードを実行すると 接続されているCD-ROMドライブの接続順で一番若いドライブ 私のパソコンだとE:ドライブ(外付け,内蔵はQ:)の情報を取得しますが Q:ドライブの情報を取得するためには、どのようなコードを記述すれば いいのでしょうか?(外付けをはずすというのは考えないで) rtnstr = String(256, 0) Rtn = mciSendString("open cdaudio", rtnstr, 256, 0) Rtn = mciSendString("set cdaudio time format tmsf", rtnstr, 256, 0) '全トラック数を取得する Rtn = mciSendString("status cdaudio number of tracks", rtnstr, 256, 0) 全トラック数 = Val(rtnstr) 'CDの全演奏時間 Rtn = mciSendString("status cdaudio length", rtnstr, 256, 0) 全演奏時間 = rtnstr

  • nekko
  • お礼率100% (3/3)

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

たしかにMCIに命令だけを投げると、OSに登録されている中で、一番若いIDを持つCDドライブに命令が行くようですね。 これを回避する方法は、パスを指定するとよいらしいです。 んで、エイリアスを使用した方が、扱いやすくなると思います。 CDROMをドライブに挿入して、以下を試してみてください。 Option Explicit Public Const DEF_ALS_NAME  As String = "CD"  'エイリアス 文字列を使用する Public Const DEF_BUFF_SIZE As Long = &HFF&   'バッファサイズ '情報を取得するときのフォーマット Public Enum DSP_MCI_FORMAT   MCI_FMT_MSF       'Min/Sec/FRAME   (分/秒/フレーム)   MCI_FMT_TMSF      'TRACK:Min:Sec:FRAME(トラック/分/秒/フレーム)   MCI_FMT_MS       'ms         (ミリ秒) End Enum 'CDトラック情報構造体 Public Type CD_TRACK_INFO   typLen As String    '曲長   typPos As String    '曲開始位置 End Type Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long Private Declare Function mciGetErrorString Lib "winmm.dll" Alias "mciGetErrorStringA" (ByVal dwError As Long, ByVal lpstrBuffer As String, ByVal uLength As Long) As Long Public Sub Main()   Dim strCDDrive As String      'CDROMドライブ   Dim lngAllCount As Long       '曲数   Dim strAllLen  As String      'CD全体の長さ   Dim TrackInfo() As CD_TRACK_INFO  '各トラック情報      Dim lngTraucID As Long       'デバッグ用   Dim strWk    As String      strCDDrive = "G"  'Gドライブを指定   lngTraucID = 3   '3曲目を再生する      '開く   If Not MCI_OpenDevise(strCDDrive, DEF_ALS_NAME) Then     GoTo PGMEND   End If      'トラック数を取得   If Not MCI_GetTrackCount(DEF_ALS_NAME, lngAllCount) Then     GoTo PGMEND   End If      '時間形式をセット   If Not MCI_SetFormat(DEF_ALS_NAME, MCI_FMT_MSF) Then     GoTo PGMEND   End If      '全体の長さを取得する   If Not MCI_GetAllLength(DEF_ALS_NAME, strAllLen) Then     GoTo PGMEND   End If      '各曲情報を取得する   If Not MCI_GetTrackInfo(DEF_ALS_NAME, lngAllCount, TrackInfo) Then     GoTo PGMEND   End If      '時間形式をセット   If Not MCI_SetFormat(DEF_ALS_NAME, MCI_FMT_TMSF) Then     GoTo PGMEND   End If      '曲を再生する   If Not MCI_PlaySound(DEF_ALS_NAME, lngTraucID) Then     GoTo PGMEND   End If      'デバッグ用   strWk = "[トラック数] : " & lngAllCount & vbCrLf   strWk = strWk & "[全体のサイズ] : " & strAllLen & vbCrLf   strWk = strWk & "[再生中の曲番] : " & lngTraucID & "曲目" & vbCrLf   strWk = strWk & "[再生中の曲サイズ] : " & TrackInfo(lngTraucID).typLen & vbCrLf   strWk = strWk & "[再生中の曲開始位置] : " & TrackInfo(lngTraucID).typPos   MsgBox strWk, , "OKを押すと停止します"      '曲を停止する   Call MCI_StopSound(DEF_ALS_NAME) PGMEND:   '最後には閉じる   Call MCI_CloseDevise(DEF_ALS_NAME) End Sub 'デバイスオープン Public Function MCI_OpenDevise(inDrive As String, inAlsName As String, Optional ShareMode As Boolean = True) As Boolean   Dim lngSts As Long   Dim strWk  As String      'とりあえず指定のエイリアスのデバイス閉じておく   Call MCI_CloseDevise(DEF_ALS_NAME)      strWk = "OPEN " & inDrive & ": TYPE CDAUDIO ALIAS " & inAlsName   '共有モード指定時   If ShareMode Then     strWk = strWk & " WAIT SHAREABLE"   End If   'デバイスオープン   lngSts = mciSendString(strWk, vbNullString, 0, 0)   'エラーチェック   If (lngSts <> 0) Then     Call MCI_GetErr(lngSts)     Exit Function   End If   MCI_OpenDevise = True End Function 'デバイスクローズ Public Sub MCI_CloseDevise(inAlsName As String)   Call mciSendString("STOP " & inAlsName, vbNullString, 0, 0)   Call mciSendString("CLOSE " & inAlsName, vbNullString, 0, 0) End Sub    'トラック数を取得する Public Function MCI_GetTrackCount(inAlsName As String, outCount As Long) As Boolean   Dim lngSts As Long   Dim strBuff As String * DEF_BUFF_SIZE   'トラック数を取得   lngSts = mciSendString("STATUS " & inAlsName & " NUMBER OF TRACKS", strBuff, DEF_BUFF_SIZE, 0)   'エラーチェック   If (lngSts <> 0) Then     Call MCI_GetErr(lngSts)     Exit Function   End If   '取得値を返す   outCount = MacroBuffString(strBuff)   MCI_GetTrackCount = True End Function '全体の長さを取得する Public Function MCI_GetAllLength(inAlsName As String, outLength As String) As Boolean   Dim lngSts As Long   Dim strBuff As String * DEF_BUFF_SIZE   lngSts = mciSendString("STATUS " & inAlsName & " LENGTH", strBuff, 1024, 0)   'エラーチェック   If (lngSts <> 0) Then     Call MCI_GetErr(lngSts)     Exit Function   End If   '取得値を返す   outLength = MacroBuffString(strBuff)   MCI_GetAllLength = True End Function '曲情報を取得する Public Function MCI_GetTrackInfo(inAlsName As String, inCount As Long, outTracuInfo() As CD_TRACK_INFO) As Boolean   Dim lngSts As Long   Dim strBuff As String * DEF_BUFF_SIZE   Dim i    As Long      'CDトラック情報構造体を拡張   ReDim outTracuInfo(inCount) As CD_TRACK_INFO      '曲数ループ   For i = 1 To inCount     With outTracuInfo(i)       '// 再生時間取得       lngSts = mciSendString("STATUS " & inAlsName & " LENGTH TRACK " & i, strBuff, DEF_BUFF_SIZE, 0)       'エラーチェック       If (lngSts <> 0) Then         Call MCI_GetErr(lngSts)         Exit Function       End If       .typLen = MacroBuffString(strBuff)              '// 開始位置取得       lngSts = mciSendString("STATUS " & inAlsName & " POSITION TRACK " & i, strBuff, DEF_BUFF_SIZE, 0)       'エラーチェック       If (lngSts <> 0) Then         Call MCI_GetErr(lngSts)         Exit Function       End If       .typPos = MacroBuffString(strBuff)     End With   Next i   lngSts = mciSendString("STATUS " & inAlsName & " LENGTH", strBuff, 1024, 0)   '取得値を返す   MCI_GetTrackInfo = True End Function '時間形式をセット Public Function MCI_SetFormat(inAlsName As String, Optional inMCIDspType As DSP_MCI_FORMAT = MCI_FMT_TMSF) As Boolean   Dim lngSts   As Long   Dim strFormat  As String      '時間形式を取得   Select Case inMCIDspType     Case DSP_MCI_FORMAT.MCI_FMT_MSF:  strFormat = "MSF"     Case DSP_MCI_FORMAT.MCI_FMT_TMSF:  strFormat = "TMSF"     Case DSP_MCI_FORMAT.MCI_FMT_MS:   strFormat = "MS"   End Select      '時間形式をセット   lngSts = mciSendString("SET " & inAlsName & " TIME FORMAT " & strFormat, vbNullString, 0, 0)   'エラーチェック   If (lngSts <> 0) Then     Call MCI_GetErr(lngSts)     Exit Function   End If   MCI_SetFormat = True End Function '曲を再生する Public Function MCI_PlaySound(inAlsName As String, inSoundID As Long) As Boolean   Dim lngSts   As Long   lngSts = mciSendString("PLAY " & inAlsName & " FROM " & inSoundID & ":00:00", vbNullString, 0, 0)   'エラーチェック   If (lngSts <> 0) Then     Call MCI_GetErr(lngSts)     Exit Function   End If   MCI_PlaySound = True End Function '曲を停止する Public Sub MCI_StopSound(inAlsName As String)   Call mciSendString("STOP " & inAlsName, vbNullString, 0, 0) End Sub 'MCIで起きたエラーを表示する Public Sub MCI_GetErr(inSts As Long)   Dim strBuff As String * DEF_BUFF_SIZE   Call mciGetErrorString(inSts, strBuff, DEF_BUFF_SIZE)   MsgBox strBuff End Sub 'バッファ文字列から、有効な左部分の文字を取得する Public Function MacroBuffString(inBuff As String) As Variant   MacroBuffString = Left$(inBuff, InStr(inBuff, vbNullChar) - 1) End Function

nekko
質問者

お礼

回答ありがあとうございました。 早速、回答のコードを試したところ、うまくいきました。

その他の回答 (1)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

言い忘れ。 CD_TRACK_INFO構造体 typLen typPos には 分:秒:フレーム で値が入っています。

nekko
質問者

お礼

補足ありがとうございます。

関連するQ&A

  • 外付けCD-ROMドライブの不具合

    ノート型PCのVAIO PCG-505Vに外付けのCD-ROMドライブがうまく動きません。しばらく使ってないうちにおかしくなってしまったようです。CD-ROMドライブの電源を入れて、PCを立ち上げ、いざCD-ROMを入れても動きません。PCカードからコネクタを引っこ抜くとなぜかCDは動き(回り)はじめるのですが、再度PCカードにコネクタを接続すると、CDがとまります。 何が原因でしょうか?対処法はあるのでしょうか?

  • メビウスノートパソコンのCD-ROMドライブが壊れた!Ver.2

    前回はあまりに情報が少なすぎてごめんなさい(回答くれた方ごめんなさい)。CD-ROMドライブが壊れたというのは、CDを入れると一応まわり始めるけど、すぐに回転が止まってしまうという状況のことをいっています。もちろんそのCD-ROMドライブは内蔵のATAPI(IDEっていうのかな?よくわからないですが・・・)です。一番の問題はそのノートパソコンにOSが入っていないという事です。したがって、外付けCD-ROMドライブは不可能であり(認識させられない)、また、ネットワークに接続して他のパソコンのドライブを使ってインストール、というのも不可能です(ネットワークに接続すらできない)。 OSをインストールするだけなら他に何らかの方法もありそうですが、ただ、今後そのノートパソコンを使っていくことを考えるとやはりドライブ交換が一番手っ取り早いかとおもって、皆さんの意見をいただけたらと思いました。 機種名は MN340K15 Mebius です。社外品が普通につけばいいのですが・・・。 関連URL:http://oshiete1.goo.ne.jp/kotaeru.php3?qid=134917

  • CD-ROMドライブにアクセスできない

    先日、仮想CDドライブ構築ソフトをアンインストールしたところ 既存の実CD-ROMドライブのQと、外付けSCSI CD-RWのKドライブの名前がともに「リムーバブルディスク」とアイコンも変化してしまいました。 CDを入れると回転はするのですが、マイコンピュータからもエクスプローラからもアクセスできず。 スキャンディスクやレジストリ復元、ドライブレターの変更など思いつくことは試してみましたが解決されません。 どなたか御教授よろしくお願いします。

  • CD-ROMドライブから起動した場合の認識について

    CD-ROMドライブから起動した場合のドライブの認識方法について教えてください。 内蔵HDDはCドライブ、[外付けHDD]または[USBメモリ]はEドライブなどと表示されますが、その認識方法はどのようになっているのでしょう? xpのパソコンがあり、そのパソコンに[外付けHDD]または[USBメモリ]が接続されているとします。 内蔵HDDはブートデバイスとせず、CD-ROMドライブをブートデバイスとします。 =============================================== Aパターン LinuxOSのKnoppixをCD-ROMドライブからブートした場合、 内蔵HDDを認識する手順は 内蔵HDDのMBRにあるブートローダが起動して、内蔵HDDのMBR内のパーティションテーブルを参照することで内蔵HDDのパーティションを認識する。 [外付けHD]または[USBメモリ]のドライブを認識する手順は [外付けHDD]または[USBメモリ]のMBRにあるブートローダが起動して、[外付けHDD]または[USBメモリ]のMBR内のパーティションテーブルを参照することで[外付けHDD]または[USBメモリ]のパーティションを認識する。 Bパターン WindowsPEで動作するソフトをCD-ROMドライブからブートした場合、 内蔵HDDを認識する手順は 内蔵HDDのMBRにあるブートローダが起動して、内蔵HDDのMBR内のパーティションテーブルを参照することで内蔵HDDのパーティションを認識する。 [外付けHD]または[USBメモリ]のドライブを認識する手順は [外付けHDD]または[USBメモリ]のMBRにあるブートローダが起動して、[外付けHDD]または[USBメモリ]のMBR内のパーティションテーブルを参照することで[外付けHDD]または[USBメモリ]のパーティションを認識する。 ======================================================== Aパターン、Bパターンそれぞれのケースで ドライブの認識手順は上記で正しいのか、ご教示ください。 MBRについて参考にしたサイト http://www14.plala.or.jp/campus-note/vine_linux/install/boot_sequence.html

  • DVD/CD-ROMドライブがコンピュータに認識されなくなった

    DVD/CD-ROMドライブが突然使えなくなりました。プロパティでディバイスの状態を確認すると「このハードウェアのデバイス ドライバを読み込むことができません。ドライバが壊れているか、ドライバがない可能性があります。 (コード 39)」のメッセージが表示されます。使用コンピュータはDELL Dimension 4700Cです。DVD/CD-ROMはSONY DVD+-RW DW-D56A ATA Deviceです。  ちなみに、外付けのDVD/CD-ROMを接続しても同様のメッセージが表示され使用不可の状態です。

  • VAIO PCG-505 が外付けCD-ROMドライブを認識しない

    VAIO PCG-505 が外付けCD-ROMドライブ(PCGA-CD5)を認識しないのですが、 どうすればよいのでしょうか? PCMソケットに接続しようとしています。

  • USB サウンドユニット と 内蔵CD-ROMドライブについて

    いままで、PCI接続のサウンドボードを使っていましたが、USB サウンドユニット にしたいと思うのですが、その場合内蔵CD-ROMドライブのケーブル接続はどのようにするのでしょうか。いままではPCI接続のサウンドボードの端子に接続していたわけですが、外付けとなるとその接続は不可能になるのでしょうか。つまり、内蔵CD-ROMドライブからの再生は不可能になるのでしょうか。初歩的な質問で申し訳ないのですが、どなたか教えて下さい。

  • USBのないノートに対応するCD-ROMドライブを探しています。

    IBM Thinkpad 560E を使っています。FDDは純正の外付けのものがあります。CD-ROMドライブも付けたいと思ってオークションで見てみましたが、接続について良く分かりません。 1)USB対応でないCD-ROMドライブであることは、どうやったら(商品の説明のどこを見たら)分かりますか? 2)PCへは、シリアルポートというのに接続する訳でしょうか?カードスロットもまだ1枚残っています。ケーブルは何が必要ですか? 参考になるか分かりませんが、OSは98SEです。PC自体が古いので、速度にはそれほどこだわっていません。 よろしくお願いします。

  • CD-ROMドライブ破損のPCの再イストールについて

    現在VAIO PCG-GR3N/BPをを使用していますが「Operating System not found」とエラーが出たままOS(WinXP)が立ち上がらないため再インストールしかないと考えています。ただ、CD-ROMドライブが破損使用ができないためどのように再インストールして良いのかわかりません。無理なのでしょうか?外付け(USB接続)のCD-ROMドライブを使用しています。 どなたか教えていただけないでしょうか。 お願い致します。

  • 内蔵型CD-ROMをIDE→USBのケーブルで接続の際

    内蔵型CD-ROMをIDE→USBのケーブルで接続し、音楽CDからトラックをWAVEデータとして読み込みたいのですが、電源コードとケーブルを接続すれば大丈夫なようですが、ドライブにある「DIGITAL AUDIO」とか「ANALOG AUDIO」と書かれたところにつなぐ赤と白のコードはなくても大丈夫なのでしょうか?

専門家に質問してみよう