PSCreateDelayedMultiplexPropertyStore 函数 (propsys.h)
创建包含多个属性存储的只读延迟绑定属性存储。
语法
PSSTDAPI PSCreateDelayedMultiplexPropertyStore(
GETPROPERTYSTOREFLAGS flags,
IDelayedPropertyStoreFactory *pdpsf,
[in] const DWORD *rgStoreIds,
[in] DWORD cStores,
[in] REFIID riid,
[out] void **ppv
);
参数
flags
一个或多个 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) 对象创建一个组件对象模型,该对象实现 IPropertyStore、 INamedPropertyStore、 IObjectProvider 和 IPropertyStoreCapabilities。
应用程序一次只能从一个线程调用此对象。
在调用 PSCreateDelayedMultiplexPropertyStore 之前,必须使用 CoInitialize 或 OleInitialize 初始化 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 |