ICreatePropBagOnRegKey::Create
Create メソッドは、システム レジストリに情報を格納できるプロパティ バッグを作成する。
構文
HRESULT Create(
HKEY hkey,
LPCOLESTR subkey,
DWORD ulOptions,
DWORD samDesired,
REFIID iid,
LPVOID* ppBag
);
パラメータ
hkey
[in] レジストリ キーのハンドルを指定する。
subkey
[in] サブキーを指定する。
ulOptions
[in] 予約済み。0 でなければならない。
samDesired
[in] キーに対する適切なアクセス権を指定する。この値は、Win32 RegOpenKeyEx 関数の samDesired パラメータのフラグを任意に組み合わせて指定できる。
iid
プロパティ バッグ インターフェイスのインターフェイス識別子 (IID) を指定する。値 IID_IPropertyBag または IID_IPropertyBag2 を使う。
ppBag
[out] iid パラメータで指定するインターフェイス ポインタを受け取る変数のアドレス。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
値 | 説明 |
S_OK | 成功。 |
E_NOTIMPL | 指定した IID はサポートされていない。 |
E_OUTOFMEMORY | メモリ不足。 |
E_POINTER | NULL ポインタ引数。 |
注意
このメソッドはプロパティ バッグを作成し、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 の値を書き込むと、そのプロパティはバッグから削除され、対応するレジストリ キーが削除される。
サンプル コード
レジストリにデフォルトのチューニング要求を作成するには、まずチューニング要求オブジェクトを作成し、そのオブジェクトの IPersistPropertyBag インターフェイスを照会する。次に、プロパティ バッグへのポインタを使って IPersistPropertyBag::Save を呼び出す。
ICreatePropBagOnRegKey *pCreateRegBag;
IPropertyBag *pRegBag;
IPersistPropertyBag *pPersist;
ITuneRequest *pTuneReq;
// CreatePropBagOnRegKey オブジェクトのインスタンスを作成し、
// インターフェイスへのポインタを取得する。
HRESULT hr = CoCreateInstance(CLSID_CreatePropBagOnRegKey, NULL, CLSCTX_INPROC_SERVER,
IID_ICreatePropBagOnRegKey, (void**)&pCreateRegBag);
if (SUCCEEDED(hr))
{
//プロパティ バッグを作成する。
hr = pCreateRegBag->Create(HKEY_CURRENT_USER,
OLESTR("SOFTWARE\\Microsoft\\MSVidCtl\\DefaultTuneRequest"),
0, KEY_READ | KEY_WRITE, IID_IPropertyBag, (void**)&pRegBag);
if (SUCCEEDED(hr))
{
// pTuneReq が有効なチューニング要求へのポインタであり、
// このドキュメントの説明に従って作成されていると仮定する。
pTuneReq->QueryInterface(IID_IPersistPropertyBag, (void**)&pPersist);
// プロパティ バッグをレジストリに保存する。
pPersist->Save(pRegBag, FALSE, TRUE);
pRegBag->Release();
pPersist->Release();
}
pCreateRegBag->Release();
}
次の例では、デフォルトのチューニング要求をロードし、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;
//プロパティ バッグを作成する。
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;
// プロパティ バッグからデフォルトのチューニング要求を読み取る。
CComVariant var;
hr = pRegBag->Read(OLESTR("DefaultTuneRequest"), &var, NULL);
if (FAILED(hr)) return hr;
// チューニング要求オブジェクトを取得したことを確認する。
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;
}
参照