IDiscMaster2
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
コンピューターにインストールされている CD および DVD デバイスを列挙するには、このインターフェイスを使用します。
解説(Remarks)
スクリプトで MsftDiscMaster2 オブジェクトを作成するには、CreateObject を呼び出す際のプログラム識別子として IMAPI2.MsftDiscMaster2 を使用します。
デバイスがコンピューターに追加またはコンピューターから削除されたときに通知を受け取るには、DDiscMaster2Events インターフェイスを実装します。
メソッド 4
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
コンピューターにインストールされている CD および DVD デバイスの一覧を取得します。
| ppunk | IEnumVARIANT** | out | コンピューターにインストールされている CD および DVD デバイスを列挙するために使用する IEnumVariant インターフェイスです。列挙される項目は、型が VT_BSTR のバリアントです。デバイスの一意の識別子を取得するには、bstrVal メンバーを使用します。 |
戻り値
要求された数の要素 (celt) が正常に返された場合、または返された項目数 (pceltFetched) が要求された要素数より少ない場合に S_OK が返されます。celt および pceltFetched パラメーターは IEnumVariant で定義されています。
実装によってはその他の成功コードが返されることもあります。次のエラーコードは操作の失敗時に一般的に返されるものですが、返される可能性のある値はこれらだけではありません:
| 戻り値 | 説明 |
|---|---|
|
ポインターが無効です。
値: 0x80004003 |
解説(Remarks)
この列挙は呼び出し時点でのコンピューター上のデバイスのスナップショットであり、その後に追加または削除されたデバイスは反映されません。デバイスがコンピューターに追加またはコンピューターから削除されたときに通知を受け取るには、DDiscMaster2Events インターフェイスを実装します。
単一の識別子を取得するには、IDiscMaster2::get_Item プロパティを参照してください。
デバイス識別子は、Windows プラグ アンド プレイが認識する特定のデバイスに対して一意かつ不変であることが保証されています。この識別子は、ユーザーの既定の書き込みドライブを保存するためのキー値として使用できるほか、高度なアプリケーションではデバイス固有の静的な情報 (VendorID や ProductID など) をキャッシュする目的でも使用できます。
指定したディスクデバイスの一意の識別子を取得します。
| index | INT | in | 一意の識別子を取得するデバイスの、0 から始まるインデックスです。 このインデックス値は、デバイスがコンピューターに追加またはコンピューターから削除される PNP 動作時や、ブート セッションをまたいだ場合に変化することがあります。 |
| value | LPWSTR* | out | 指定したインデックスに対応するディスクデバイスの一意の識別子を格納する文字列です。 |
戻り値
成功した場合は S_OK が返されますが、実装によってはその他の成功コードが返されることもあります。次のエラーコードは操作の失敗時に一般的に返されるものですが、返される可能性のある値はこれらだけではありません:
| 戻り値 | 説明 |
|---|---|
|
1 つ以上の引数が無効です。
値: 0x80070057 |
|
|
ポインターが無効です。
値: 0x80004003 |
|
|
必要なメモリの割り当てに失敗しました。
値: 0x8007000E |
解説(Remarks)
すべての識別子を列挙するには、IDiscMaster2::get__NewEnum メソッドを呼び出します。
次のサンプルは、IDiscMaster2 オブジェクトを最初に作成した後に追加または削除されたドライブを正確に把握するために、光学ドライブを再列挙する方法を示しています。これは IDiscMaster2::get_Item メソッドと IDiscMaster2::get_Count メソッドによって実現します:
#include <windows.h>
#include <tchar.h>
#include <imapi2.h>
#include <objbase.h>
#include <stdio.h>
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "user32.lib")
int __cdecl _tmain(int argc, TCHAR* argv[])
{
BSTR bstrDeviceName;
HRESULT hr = S_OK;
BOOL bComInitialised;
IDiscMaster2* discMaster;
UINT iCounter = 0;
LONG lValue = 0;
bComInitialised = SUCCEEDED(CoInitializeEx(0, COINIT_MULTITHREADED));
// Create an object of IDiscMaster2
if (SUCCEEDED(hr)){
CoCreateInstance(
CLSID_MsftDiscMaster2,
NULL, CLSCTX_ALL,
IID_PPV_ARGS(&discMaster)
);
if(FAILED(hr)){
_tprintf(TEXT("\nUnsuccessful in creating an instance of CLSID_MsftDiscMaster2.\n\nError returned: 0x%x\n"), hr);
return 0;
}
}
//
// Loop twice and get the optical drives attached to the system,
// first time just get the current configuration and second time
// prompt the user to change the configuration and then get the
// altered configuration.
//
do{
// Get the number of drives
if (SUCCEEDED(hr)){
hr = discMaster->get_Count(&lValue);
if (SUCCEEDED(hr)){
_tprintf(TEXT("\nTotal number of drives = %d\n"), lValue);
}
}
// Print all the optical drives attached to the system
if (SUCCEEDED(hr)){
for(LONG iCount = 0; iCount < lValue; iCount++) {
hr = discMaster->get_Item(iCount, &bstrDeviceName);
_tprintf(TEXT("\nUnique identifier of the disc device associated with index %d is: %s\n"), iCount, bstrDeviceName);
}
}
// Prompt the user to unhook or add drives
if (iCounter < 1){
MessageBox(NULL,TEXT("Please un-hook or add drives and hit OK"), TEXT("Manual Action"), MB_OK);
_tprintf(TEXT("\nGetting the altered configuration ... \n"));
}
iCounter++;
}while(iCounter < 2);
discMaster->Release();
CoUninitialize();
bComInitialised = FALSE;
return 0;
コンピューターにインストールされている CD および DVD ディスクデバイスの数を取得します。
| value | INT* | out | コンピューターにインストールされている CD および DVD ディスクデバイスの数です。 |
戻り値
成功した場合は S_OK が返されますが、実装によってはその他の成功コードが返されることもあります。次のエラーコードは操作の失敗時に一般的に返されるものですが、返される可能性のある値はこれらだけではありません:
| 戻り値 | 説明 |
|---|---|
|
ポインターが無効です。
値: 0x80004003 |
|
|
必要なメモリの割り当てに失敗しました。
値: 0x8007000E |
|
|
原因不明の失敗です。
値: 0x80004005 |
環境に 1 つ以上の光学デバイスが含まれており、かつ実行コンテキストがそれらのデバイスにアクセスする権限を持っているかどうかを示す値を取得します。
| value | VARIANT_BOOL* | out | 環境に 1 つ以上の光学デバイスが含まれ、かつ実行コンテキストがそれらのデバイスにアクセスする権限を持っている場合は VARIANT_TRUE、それ以外の場合は VARIANT_FALSE です。 |
戻り値
成功した場合は S_OK が返されますが、実装によってはその他の成功コードが返されることもあります。次のエラーコードは操作の失敗時に一般的に返されるものですが、返される可能性のある値はこれらだけではありません:
| 戻り値 | 説明 |
|---|---|
|
ポインターが無効です。
値: 0x80004003 |
解説(Remarks)
このメソッドは IDiscMaster2 内のすべての文字列をループ処理し、各文字列を使用して DiscRecorder2 オブジェクトの初期化を試みます。システム上のいずれかのレコーダーで初期化に成功した場合、このメソッドは TRUE を返します。
環境には少なくとも 1 つのタイプ 5 光学デバイスが含まれている必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDiscMaster2 "{27354130-7F64-5B0F-8F00-5D77AFBE261E}" #usecom global IDiscMaster2 IID_IDiscMaster2 "{}" #comfunc global IDiscMaster2_get__NewEnum 7 sptr #comfunc global IDiscMaster2_get_Item 8 int,var #comfunc global IDiscMaster2_get_Count 9 var #comfunc global IDiscMaster2_get_IsSupportedEnvironment 10 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IDiscMaster2 "{27354130-7F64-5B0F-8F00-5D77AFBE261E}" #usecom global IDiscMaster2 IID_IDiscMaster2 "{}" #comfunc global IDiscMaster2_get__NewEnum 7 sptr #comfunc global IDiscMaster2_get_Item 8 int,sptr #comfunc global IDiscMaster2_get_Count 9 sptr #comfunc global IDiscMaster2_get_IsSupportedEnvironment 10 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。