ICreatePropBagOnRegKey
COM公式ドキュメント
ICreatePropBagOnRegKey インターフェイスは、システムレジストリに情報を格納できるプロパティバッグを作成します。既定のチューン要求をレジストリに格納するには、このインターフェイスを使用します。
解説(Remarks)
このインターフェイスのインターフェイス識別子 (IID) を宣言するには、__uuidof 演算子を使用します: __uuidof(ICreatePropBagOnRegKey)。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Create メソッドは、システムレジストリに情報を格納できるプロパティバッグを作成します。
| hkey | HKEY | in | レジストリキーのハンドルを指定します。 |
| subkey | LPWSTR | in | サブキーを指定します。 |
| ulOptions | DWORD | in | 予約済み。ゼロにする必要があります。 |
| samDesired | DWORD | in | キーに対して必要なアクセス権を指定します。値には、Win32 の RegOpenKeyEx 関数の samDesired パラメーターで使用できるフラグの任意の組み合わせを指定できます。 |
| iid | GUID* | in | プロパティバッグインターフェイスのインターフェイス識別子 (IID) を指定します。値 IID_IPropertyBag または IID_IPropertyBag2 を使用します。 |
| ppBag | void** | out | iid パラメーターで指定されたインターフェイスを受け取る変数のアドレスです。 |
戻り値
HRESULT 値を返します。可能な値には次のものがあります。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| 指定された IID はサポートされていません。 | |
| メモリが不足しています。 | |
| NULL ポインター引数です。 |
解説(Remarks)
このメソッドはプロパティバッグを作成し、iid パラメーターの値に応じて IPropertyBag または IPropertyBag2 インターフェイスへのポインターを返します。返されたプロパティバッグは、samDesired パラメーターで指定されたアクセス権を使用して、指定されたレジストリキーにアクセスできます。各プロパティバッグメソッドには、次のようにそれぞれ異なるアクセス権が必要です:
| メソッド | 必要なアクセス権 |
|---|---|
| IPropertyBag::Read | KEY_READ |
| IPropertyBag::Write | KEY_WRITE |
| IPropertyBag2::CountProperties | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS |
| IPropertyBag2::GetPropertyInfo | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS |
VT_EMPTY または VT_NULL の値を書き込むと、そのプロパティはバッグから削除され、対応するレジストリ値が削除されます。
例
次のサンプルコードは、既定のチューン要求をレジストリに作成し、読み戻す方法を示しています:
CComPtr <ICreatePropBagOnRegKey> pCreateRegBag;
HRESULT hr = pCreateRegBag.CoCreateInstance(CLSID_CreatePropBagOnRegKey);
CComPtr <IPropertyBag> pRegBag;
hr = pCreateRegBag->Create(HKEY_CURRENT_USER,
OLESTR("SOFTWARE\\Microsoft\\MSVidCtl\\DefaultTuneRequest"),
0, KEY_READ | KEY_WRITE, IID_IPropertyBag, (void**)&pRegBag);
if(FAILED(hr))
{
ATLASSERT(FALSE);
return E_FAIL;
}
CComPtr <IAnalogTVTuningSpace> pTuneSpace;
hr = pTuneSpace.CoCreateInstance(CLSID_AnalogTVTuningSpace);
if(FAILED(hr))
{
ATLASSERT(FALSE);
return E_FAIL;
}
CComPtr<ITuneRequest> pTuneRequest;
hr = pTuneSpace->CreateTuneRequest(&pTuneRequest);
if(FAILED(hr))
{
ATLASSERT(FALSE);
return E_FAIL;
}
CComQIPtr <IPersistPropertyBag> pPersist(pTuneRequest);
CComVariant v((IUnknown*)(pTuneRequest));
hr = pRegBag->Write(L"tr", &v);
if(FAILED(hr))
{
ATLASSERT(FALSE);
return E_FAIL;
}
//restore
CComPtr <IPropertyBag> pRegBag2;
hr = pCreateRegBag->Create(HKEY_CURRENT_USER,
OLESTR("SOFTWARE\\Microsoft\\MSVidCtl\\DefaultTuneRequest"),0, KEY_READ,
IID_IPropertyBag, reinterpret_cast<void**>(&pRegBag2));
if(FAILED(hr))
{
ATLASSERT(FALSE);
return E_FAIL;
}
CComVariant var;
hr = pRegBag2->Read(OLESTR("tr"), &var, NULL);
if(FAILED(hr))
{
ATLASSERT(FALSE);
return E_FAIL;
}
// Make sure we have a tune request object.
CComQIPtr<ITuneRequest> pTune;
switch (var.vt)
{
case VT_UNKNOWN:
pTune = var.punkVal;
break;
case VT_DISPATCH:
pTune = var.pdispVal;
break;
}
次の例は、既定のチューン要求を読み込み、ITuneRequest インターフェイスポインターを返します:
HRESULT LoadDefaultTuneReq(ITuneRequest **ppTuneReq)
{
HRESULT hr;
*ppTuneReq = NULL;
CComPtr<ICreatePropBagOnRegKey> pCreateRegBag;
hr = pCreateRegBag.CoCreateInstance(CLSID_CreatePropBagOnRegKey,
NULL, CLSCTX_INPROC_SERVER);
if (FAILED(hr)) return hr;
//Create the property bag.
CComPtr<IPropertyBag> pRegBag;
hr = pCreateRegBag->Create(HKEY_CURRENT_USER,
OLESTR("SOFTWARE\\Microsoft\\MSVidCtl"), 0, KEY_READ,
IID_IPropertyBag, reinterpret_cast<void**>(&pRegBag));
if (FAILED(hr)) return hr;
// Read the default tune request from the property bag.
CComVariant var;
hr = pRegBag->Read(OLESTR("DefaultTuneRequest"), &var, NULL);
if (FAILED(hr)) return hr;
// Make sure we got a tune request object.
CComQIPtr<ITuneRequest> pTune;
switch (var.vt)
{
case VT_UNKNOWN:
pTune = var.punkVal;
break;
case VT_DISPATCH:
pTune = var.pdispVal;
break;
}
if (pTune)
{
*ppTuneReq = pTune.Detach();
return S_OK;
}
return E_FAIL;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICreatePropBagOnRegKey "{8A674B48-1F63-11D3-B64C-00C04F79498E}" #usecom global ICreatePropBagOnRegKey IID_ICreatePropBagOnRegKey "{8A674B49-1F63-11D3-B64C-00C04F79498E}" #comfunc global ICreatePropBagOnRegKey_Create 3 sptr,wstr,int,int,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ICreatePropBagOnRegKey "{8A674B48-1F63-11D3-B64C-00C04F79498E}" #usecom global ICreatePropBagOnRegKey IID_ICreatePropBagOnRegKey "{8A674B49-1F63-11D3-B64C-00C04F79498E}" #comfunc global ICreatePropBagOnRegKey_Create 3 sptr,wstr,int,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。