Функция 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*
Указатель на массив идентификаторов хранилищ свойств. Этот массив не требуется инициализировать.
[in] cStores
Тип: DWORD
Количество элементов в массиве, на который указывает rgStoreIds.
[in] riid
Тип: REFIID
Ссылка на запрошенный ИДЕНТИФИКАТОР интерфейса, который будет представлять созданное хранилище свойств.
[out] ppv
Тип: void**
При возврате этой функции содержит указатель интерфейса, запрошенный в riid. Обычно это IPropertyStore.
Возвращаемое значение
Тип: HRESULT
Если эта функция выполняется успешно, она возвращает S_OK. В противном случае возвращается код ошибки HRESULT .
Комментарии
Эта функция создает объект COM, реализующий IPropertyStore, INamedPropertyStore, IObjectProvider и IPropertyStoreCapabilities.
Приложения должны вызывать этот объект только из одного потока за раз.
Перед вызовом PSCreateDelayedMultiplexPropertyStore необходимо инициализировать COM с помощью CoInitialize или OleInitialize. COM должен оставаться инициализированным в течение времени существования этого объекта.
PSCreateDelayedMultiplexPropertyStore разработан в качестве альтернативы PSCreateMultiplexPropertyStore, который требует инициализации массива хранилищ свойств перед созданием хранилища свойств мультиплекса.
Механизм отложенной привязки разработан как повышение производительности для вызовов IPropertyStore::GetValue в хранилище свойств мультиплекса. При запросе значения свойства отложенное хранилище свойств мультиплекса проверяет каждое из хранилищ свойств на наличие значения. После обнаружения значения нет необходимости создавать и инициализировать последующие хранилища. Отложенное хранилище свойств мультиплекса прекращает поиск значения, когда одно из хранилищ свойств возвращает код успешного выполнения и не VT_EMPTY значение.
Когда отложенному хранилищу свойств мультиплекса требуется доступ к определенному хранилищу свойств, сначала проверяется, получено ли уже интерфейс для этого хранилища свойств. В противном случае он вызывает IDelayedPropertyStoreFactory::GetDelayedPropertyStore с соответствующим идентификатором хранилища свойств для получения хранилища свойств. Он всегда использует идентификаторы хранилища свойств в порядке, в котором они предоставляются приложением. Возможно, будут использоваться не все идентификаторы.
Если вызов IDelayedPropertyStoreFactory завершается сбоем с E_NOTIMPL или E_ACCESSDENIED для определенного идентификатора хранилища свойств или если приложение указало GPS_BESTEFFORT, сбой игнорируется и отложенное хранилище свойств мультиплекса перемещается в следующее хранилище свойств.
В некоторых случаях может быть полезно использовать PSCreateDelayedMultiplexPropertyStore вместо PSCreateMultiplexPropertyStore. Например, если приложению требуется мультиплексировать два хранилища свойств, а первое хранилище свойств не требует большого объема памяти для инициализации и предоставляет PKEY_Size сведения. Часто вызывающие приложения запрашивают хранилище свойств мультиплекса, а затем запрашивают только PKEY_Size перед освобождением объекта. В этом случае приложение может избежать затрат на инициализацию второго хранилища свойств, вызвав PSCreateDelayedMultiplexPropertyStore и реализовав IDelayedPropertyStoreFactory.
Примеры
В следующем примере, который будет включен в состав более крупной программы, показано, как использовать PSCreateDelayedMultiplexPropertyStore в реализации IPropertyStoreFactory::GetPropertyStore.
// 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 с пакетом обновления 2 (SP2), Windows Vista [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 с пакетом обновления 1 (SP1) [только классические приложения] |
Целевая платформа | Windows |
Header | propsys.h |
Библиотека | Propsys.lib |
DLL | Propsys.dll (версия 6.0 или более поздняя) |
Распространяемые компоненты | Windows Desktop Search (WDS) 3.0 |