Функция PSCreateMultiplexPropertyStore (propsys.h)

Создает хранилище свойств только для чтения, содержащее несколько хранилищ свойств, каждое из которых должно поддерживать IPropertyStore или IPropertySetStorage.

Синтаксис

PSSTDAPI PSCreateMultiplexPropertyStore(
  [in]  IUnknown **prgpunkStores,
  [in]  DWORD    cStores,
  [in]  REFIID   riid,
  [out] void     **ppv
);

Параметры

[in] prgpunkStores

Тип: IUnknown**

Адрес указателя на массив хранилищ свойств, реализующих IPropertyStore или IPropertySetStorage.

[in] cStores

Тип: DWORD

Количество элементов в массиве, на которые ссылается prgpunkStores.

[in] riid

Тип: REFIID

Ссылка на запрошенный IID.

[out] ppv

Тип: void**

При возврате этой функции содержит указатель интерфейса, запрошенный в riid. Обычно это IPropertyStore.

Возвращаемое значение

Тип: HRESULT

Если эта функция завершается успешно, она возвращает S_OK. В противном случае возвращается код ошибки HRESULT .

Комментарии

Эта функция создает com-объект модели компонентов, который реализует IPropertyStore, INamedPropertyStore, IObjectProvider и IPropertyStoreCapabilities. Объект мультиплексного хранилища свойств объединяет свойства, предоставляемые из нескольких хранилищ свойств.

Этот объект может быть полезен для агрегирования свойств из нескольких существующих реализаций хранилища свойств в расширении пространства имен оболочки или для повторного использования существующего хранилища свойств и предоставления дополнительных свойств, доступных только для чтения.

Приложения должны вызывать этот объект только из одного потока за раз.

Перед вызовом PSCreateDelayedMultiplexPropertyStore необходимо инициализировать COM с помощью CoInitialize или OleInitialize. COM должен оставаться инициализированным в течение всего времени существования этого объекта.

Каждый из объектов в массиве prgpunkStores должен реализовывать IPropertyStore или IPropertySetStorage. Если объект реализует IPropertySetStorage, он упаковывается с помощью PSCreatePropertyStoreFromPropertySetStorage для использования в хранилище свойств мультиплекса.

Реализация хранилища свойств мультиплекса IPropertyStore::GetValue запрашивает у каждого из предоставленных хранилищ свойств значение. Хранилище свойств мультиплекса прекращает поиск, когда одно из хранилищ свойств возвращает код успешного выполнения и значение, отличное от VT_EMPTY. Коды сбоев приводят к завершению поиска и передаются обратно в вызывающее приложение.

Реализация хранилища свойств мультиплекса IPropertyStoreCapabilities::IsPropertyWritable делегирует вызов первому хранилищу, реализующего IPropertyStoreCapabilities. Если несколько хранилищ реализуют IPropertyStoreCapabilities, последующие из них игнорируются. Если ни в каких хранилищах не реализован интерфейс IPropertyStoreCapabilities, этот метод возвращает S_OK.

Примеры

В следующем примере, который будет включен в более крупную программу, показано, как использовать PSCreateMultiplexPropertyStore в реализации IPropertyStoreFactory::GetPropertyStore.

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

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

// Private functions are prefixed with an underscore.
 
// 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.
 
        // CMyFactory multiplexes two property stores.
        IPropertyStore *ppsFirst;
        
        hr = _CreateFirstStore(IID_PPV_ARGS(&ppsFirst));
        
        if (SUCCEEDED(hr))
        {
            IPropertyStore *ppsSecond;
            
            hr = _CreateSecondStore(IID_PPV_ARGS(&ppsSecond));
            
            if (SUCCEEDED(hr))
            {
                IUnknown *rgStores[] = {ppsFirst, ppsSecond};
            
                hr = PSCreateMultiplexPropertyStore(rgStores, ARRAYSIZE(rgStores), riid, ppv);
            
                ppsSecond->Release();
            }
            ppsFirst->Release();
        }
    }
    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

См. также раздел

IPropertyStoreFactory

PSCreateDelayedMultiplexPropertyStore