質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Q&A

解決済

1回答

303閲覧

BDドライブ内のメディアの種類を取得したい VC++

HOOOO

総合スコア6

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

0グッド

0クリップ

投稿2024/05/24 06:49

編集2024/05/24 08:27

実現したいこと

BDドライブ内のメディアの種類を取得したいです。
言語はVC++です。

前提

BDドライブ内に存在する空のメディアに対して、メディアの種類を取得したいです。
IMAPIを使用すれば、取得できると思い、以下の実装を行いました。
しかし、get_CurrentPhysicalMediaTypeで取得できた
mediaTypeは「IMAPI_MEDIA_TYPE_UNKNOWN」であり、
メディアの種類を取得できていません。
また、pDiscFormat2Data->get_CurrentPhysicalMediaType(&mediaType);には
「0xc0aa0003」が返ってきました。

該当のソースコード

VC++

1CoInitialize(NULL); 2 3IDiscFormat2Data* pDiscFormat2Data = NULL; 4 5// IDiscFormat2Dataの初期化 6HRESULT hr = CoCreateInstance(__uuidof(MsftDiscFormat2Data), NULL, CLSCTX_INPROC_SERVER, 7 __uuidof(IDiscFormat2Data), (void**)&pDiscFormat2Data); 8if (FAILED(hr)) { 9 CoUninitialize(); 10 return; 11 } 12 13IMAPI_MEDIA_PHYSICAL_TYPE mediaType = IMAPI_MEDIA_TYPE_UNKNOWN; 14//メディアの種類を取得 15 hr = pDiscFormat2Data->get_CurrentPhysicalMediaType(&mediaType); 16if (FAILED(hr)) { 17 pDiscFormat2Data->Release(); 18 CoUninitialize(); 19 return; 20 }

ソースコードのどの部分に間違いがあるのでしょうか?
メディアの種類を取得しようと考えた時に他の方法があるのでしょうか?
方法は問いませんので、VC++でメディアの種類を取得する方法がございましたら、教えて頂きたいです。

補足情報(FW/ツールのバージョンなど)

使用ツール:Visual Studio 2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Windows 11、Visual Studio 2022で確認しました。

(参考)
特にGetDiscRecorder関数と、それの呼び出し側
https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/Win7Samples/winbase/imapi/imapi2sample/imapi2sample.cpp

Microsoftのリファレンスを見ると、判定対象の光学ドライブ(文中ではrecorder)を指定していない場合に0xc0aa0003を返します。
https://learn.microsoft.com/en-us/windows/win32/api/imapi2/nf-imapi2-idiscformat2data-get_currentphysicalmediatype

ドライブを指定する手順

  1. IDiscMaster2::get_Countでドライブ台数を取る
  2. 台数分、以下を繰り返す。1台のみの場合は、index=0で決め打ち
  3. IDiscMaster2::get_Itemに、index指定でID取得
  4. IDiscRecorder2::InitializeDiscRecorderに、ID指定で初期化
  5. IDiscFormat2Data::put_Recorderに、初期化したIDiscRecorder2指定

1台決め打ち、hr判定省略だと以下の通りです。

// IDiscFormat2Dataの初期化 (略) // 追加ここから IDiscMaster2 *dm = nullptr; wchar_t *id = nullptr; IDiscRecorder2 *dr = nullptr; CoCreateInstance(CLSID_MsftDiscMaster2, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&dm)); dm->get_Item(0, &id); CoCreateInstance(CLSID_MsftDiscRecorder2, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&dr)); dr->InitializeDiscRecorder(id); pDiscFormat2Data->put_Recorder(dr); // 追加ここまで IMAPI_MEDIA_PHYSICAL_TYPE mediaType = IMAPI_MEDIA_TYPE_UNKNOWN; (略)

投稿2024/05/24 13:18

hiroki-o

総合スコア847

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HOOOO

2024/05/27 01:33

いつもお世話になっております。 教えて頂いた通りの手順でメディア情報の取得を行うことができました。 こちらの手順を参考に複数台のドライブから指定したドライブの情報が取得できるように拡張していこうと思います。 今回もご教授いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問