PSCreateDelayedMultiplexPropertyStore 函数 (propsys.h)

创建包含多个属性存储的只读延迟绑定属性存储。

语法

PSSTDAPI PSCreateDelayedMultiplexPropertyStore(
        GETPROPERTYSTOREFLAGS        flags,
        IDelayedPropertyStoreFactory *pdpsf,
  [in]  const DWORD                  *rgStoreIds,
  [in]  DWORD                        cStores,
  [in]  REFIID                       riid,
  [out] void                         **ppv
);

参数

flags

类型: GETPROPERTYSTOREFLAGS

一个或多个 GETPROPERTYSTOREFLAGS 值。 这些值指定创建的属性存储对象的详细信息。

pdpsf

类型: IDelayedPropertyStoreFactory*

指向 IDelayedPropertyStoreFactory 实例的接口指针。

[in] rgStoreIds

类型: const DWORD*

指向属性存储 ID 数组的指针。 无需初始化此数组。

[in] cStores

类型:DWORD

rgStoreIds 指向的数组中的元素数。

[in] riid

类型: REFIID

对将表示所创建属性存储的接口的请求 IID 的引用。

[out] ppv

类型: void**

当此函数返回时,包含 riid 中请求的接口指针。 这通常是 IPropertyStore

返回值

类型: HRESULT

如果此函数成功,则返回 S_OK。 否则,将返回 HRESULT 错误代码。

注解

此函数 (COM) 对象创建一个组件对象模型,该对象实现 IPropertyStoreINamedPropertyStoreIObjectProviderIPropertyStoreCapabilities

应用程序一次只能从一个线程调用此对象。

在调用 PSCreateDelayedMultiplexPropertyStore 之前,必须使用 CoInitializeOleInitialize 初始化 COM。 COM 必须在此对象的生存期内保持初始化状态。

PSCreateDelayedMultiplexPropertyStore 设计为 PSCreateMultiplexPropertyStore 的替代方法,PSCreateMultiplexPropertyStore 要求在创建多路复用属性存储之前初始化属性存储的数组。

延迟绑定机制设计为在多路复用属性存储上调用 IPropertyStore::GetValue 的性能增强。 当系统询问属性的值时,延迟多路复用属性存储会检查每个属性存储的值。 找到值后,无需创建和初始化后续存储。 当其中一个属性存储返回成功代码和非VT_EMPTY值时,延迟的多路复用属性存储会停止搜索值。

当延迟的多路复用属性存储需要访问特定属性存储时,它首先会检查它是否已获取该属性存储的接口。 如果不是,它会使用相应的属性存储 ID 调用 IDelayedPropertyStoreFactory::GetDelayedPropertyStore 以获取属性存储。 它始终按应用程序提供 ID 的顺序使用属性存储 ID。 可能不会使用所有 ID。

如果对 IDelayedPropertyStoreFactory 的 调用失败,并且特定属性存储 ID E_NOTIMPL或E_ACCESSDENIED,或者如果 应用程序GPS_BESTEFFORT指定,则会忽略该失败,并且延迟的多路复用属性存储会移动到下一个属性存储。

在某些情况下,使用 PSCreateDelayedMultiplexPropertyStore 来代替 PSCreateMultiplexPropertyStore 可能会有所帮助。 例如,如果应用程序需要对两个属性存储进行多路复用,并且第一个属性存储不会占用大量内存来初始化并提供PKEY_Size信息。 通常,调用应用程序会请求多路复用属性存储,然后在释放对象之前仅请求PKEY_Size。 在这种情况下,应用程序可以通过调用 PSCreateDelayedMultiplexPropertyStore 并实现 IDelayedPropertyStoreFactory 来避免初始化第二个属性存储的成本。

示例

以下示例将作为较大程序的一部分包含,演示如何在 IPropertyStoreFactory::GetPropertyStore 的实现中使用 PSCreateDelayedMultiplexPropertyStore

// CMyFactory is a reference-counted COM object that implements both IPropertyStoreFactory and IDelayedPropertyStoreFactory.

// CMyFactory is assumed to be fully implemented, but for the sake of brevity, 
// many functions are not shown here. 

// Private functions are indicated with an underscore prefix.

// The hope is that the fastest property store satisfies the caller's queries 
// so that the slower property stores are never created.
 
// CMyFactory implementation for IPropertyStoreFactory::GetPropertyStore
HRESULT CMyFactory::GetPropertyStore( __in GETPROPERTYSTOREFLAGS flags,
                                      __in_opt IUnknown *pUnkFactory,
                                      __in REFIID riid,
                                      __deref_out void **ppv)
{
    *ppv = NULL;
    HRESULT hr;
 
    // This application creates only read-only stores.
    if (flags & GPS_READWRITE)
    {
        hr = STG_E_ACCESSDENIED;
    }
    else
    {
        // More advanced applications would check other GETPROPERTYSTOREFLAGS 
        // flags and respond appropriately.
 
        // This application always creates its stores in-process, so it 
        // ignores the pUnkFactory value.
        
        DWORD rgStoreIds[] = {0, 1, 2};
        
        hr = PSCreateDelayedMultiplexPropertyStore(flags, this, rgStoreIds, ARRAYSIZE(rgStoreIds), riid, ppv);
    }
 
    return hr;
}
 
// CMyFactory implementation of IDelayedPropertyStoreFactory::GetDelayedPropertyStore
HRESULT CMyFactory::GetDelayedPropertyStore(GETPROPERTYSTOREFLAGS flags,
                                            DWORD dwStoreId,
                                            REFIID riid,
                                            void **ppv)
{
    *ppv = NULL;
    HRESULT hr;
    
    // Note: The IDs here match the IDs in rgStoreIds above.

    if (dwStoreId == 0)
    {
        // This store is the fastest at returning properties.

        hr = _CreateFastestPropertyStore(flags, riid, ppv);
    }
    else if (dwStoreId == 1)
    {
        // This store is slower at returning properties.
        hr = _CreateSlowerPropertyStore(flags, riid, ppv);
    }
    else if (dwStoreId == 2)
    {
        // This store is very slow at returning properties.
        hr = _CreateSlowestPropertyStore(flags, riid, ppv);
    }
    else
    {
        // This should never happen.
        hr = E_UNEXPECTED;
    }
    
    return hr;
}

要求

要求
最低受支持的客户端 Windows XP SP2、Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 SP1 [仅限桌面应用]
目标平台 Windows
标头 propsys.h
Library Propsys.lib
DLL Propsys.dll (版本 6.0 或更高版本)
可再发行组件 Windows 桌面搜索 (WDS) 3.0

另请参阅

IPropertyStoreFactory

PSCreateMultiplexPropertyStore