Win32 API 日本語リファレンス
ホームMedia.DirectShow.Tv › ICreatePropBagOnRegKey

ICreatePropBagOnRegKey

COM
IID8a674b48-1f63-11d3-b64c-00c04f79498e継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

ICreatePropBagOnRegKey インターフェイスは、システムレジストリに情報を格納できるプロパティバッグを作成します。既定のチューン要求をレジストリに格納するには、このインターフェイスを使用します。

解説(Remarks)

このインターフェイスのインターフェイス識別子 (IID) を宣言するには、__uuidof 演算子を使用します: __uuidof(ICreatePropBagOnRegKey)

メソッド 1

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Create(HKEY hkey, LPWSTR subkey, DWORD ulOptions, DWORD samDesired, GUID* iid, void** ppBag)

Create メソッドは、システムレジストリに情報を格納できるプロパティバッグを作成します。

hkeyHKEYinレジストリキーのハンドルを指定します。
subkeyLPWSTRinサブキーを指定します。
ulOptionsDWORDin予約済み。ゼロにする必要があります。
samDesiredDWORDinキーに対して必要なアクセス権を指定します。値には、Win32 の RegOpenKeyEx 関数の samDesired パラメーターで使用できるフラグの任意の組み合わせを指定できます。
iidGUID*inプロパティバッグインターフェイスのインターフェイス識別子 (IID) を指定します。値 IID_IPropertyBag または IID_IPropertyBag2 を使用します。
ppBagvoid**outiid パラメーターで指定されたインターフェイスを受け取る変数のアドレスです。

戻り値

HRESULT 値を返します。可能な値には次のものがあります。

リターンコード 説明
S_OK
成功しました。
E_NOTIMPL
指定された IID はサポートされていません。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。