次の方法で共有


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; 
}

参照