複数のCD-ROMドライブがある場合(mciSendString)はどうする?
- 複数の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)
- Visual Basic
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
たしかに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
その他の回答 (1)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
言い忘れ。 CD_TRACK_INFO構造体 typLen typPos には 分:秒:フレーム で値が入っています。
お礼
補足ありがとうございます。
関連するQ&A
- 外付けCD-ROMドライブの不具合
ノート型PCのVAIO PCG-505Vに外付けのCD-ROMドライブがうまく動きません。しばらく使ってないうちにおかしくなってしまったようです。CD-ROMドライブの電源を入れて、PCを立ち上げ、いざCD-ROMを入れても動きません。PCカードからコネクタを引っこ抜くとなぜかCDは動き(回り)はじめるのですが、再度PCカードにコネクタを接続すると、CDがとまります。 何が原因でしょうか?対処法はあるのでしょうか?
- 締切済み
- その他(PCパーツ・周辺機器)
- メビウスノートパソコンの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
- ベストアンサー
- ノートPC
- CD-ROMドライブにアクセスできない
先日、仮想CDドライブ構築ソフトをアンインストールしたところ 既存の実CD-ROMドライブのQと、外付けSCSI CD-RWのKドライブの名前がともに「リムーバブルディスク」とアイコンも変化してしまいました。 CDを入れると回転はするのですが、マイコンピュータからもエクスプローラからもアクセスできず。 スキャンディスクやレジストリ復元、ドライブレターの変更など思いつくことは試してみましたが解決されません。 どなたか御教授よろしくお願いします。
- 締切済み
- Windows 95・98
- 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
- ベストアンサー
- Windows XP
- DVD/CD-ROMドライブがコンピュータに認識されなくなった
DVD/CD-ROMドライブが突然使えなくなりました。プロパティでディバイスの状態を確認すると「このハードウェアのデバイス ドライバを読み込むことができません。ドライバが壊れているか、ドライバがない可能性があります。 (コード 39)」のメッセージが表示されます。使用コンピュータはDELL Dimension 4700Cです。DVD/CD-ROMはSONY DVD+-RW DW-D56A ATA Deviceです。 ちなみに、外付けのDVD/CD-ROMを接続しても同様のメッセージが表示され使用不可の状態です。
- ベストアンサー
- その他(PCパーツ・周辺機器)
- VAIO PCG-505 が外付けCD-ROMドライブを認識しない
VAIO PCG-505 が外付けCD-ROMドライブ(PCGA-CD5)を認識しないのですが、 どうすればよいのでしょうか? PCMソケットに接続しようとしています。
- ベストアンサー
- ノートPC
- 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自体が古いので、速度にはそれほどこだわっていません。 よろしくお願いします。
- ベストアンサー
- ノートPC
- CD-ROMドライブ破損のPCの再イストールについて
現在VAIO PCG-GR3N/BPをを使用していますが「Operating System not found」とエラーが出たままOS(WinXP)が立ち上がらないため再インストールしかないと考えています。ただ、CD-ROMドライブが破損使用ができないためどのように再インストールして良いのかわかりません。無理なのでしょうか?外付け(USB接続)のCD-ROMドライブを使用しています。 どなたか教えていただけないでしょうか。 お願い致します。
- 締切済み
- ノートPC
- 内蔵型CD-ROMをIDE→USBのケーブルで接続の際
内蔵型CD-ROMをIDE→USBのケーブルで接続し、音楽CDからトラックをWAVEデータとして読み込みたいのですが、電源コードとケーブルを接続すれば大丈夫なようですが、ドライブにある「DIGITAL AUDIO」とか「ANALOG AUDIO」と書かれたところにつなぐ赤と白のコードはなくても大丈夫なのでしょうか?
- ベストアンサー
- その他(PCパーツ・周辺機器)
お礼
回答ありがあとうございました。 早速、回答のコードを試したところ、うまくいきました。