Compartir a través de


Función PSCreateDelayedMultiplexPropertyStore (propsys.h)

Crea un almacén de propiedades de enlace retrasado de solo lectura que contiene varios almacenes de propiedades.

Sintaxis

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

Parámetros

flags

Tipo: GETPROPERTYSTOREFLAGS

Uno o varios valores GETPROPERTYSTOREFLAGS . Estos valores especifican los detalles del objeto de almacén de propiedades creado.

pdpsf

Tipo: IDelayedPropertyStoreFactory*

Puntero de interfaz a una instancia de IDelayedPropertyStoreFactory.

[in] rgStoreIds

Tipo: const DWORD*

Puntero a una matriz de identificadores de almacén de propiedades. No es necesario inicializar esta matriz.

[in] cStores

Tipo: DWORD

Número de elementos de la matriz a los que apunta rgStoreIds.

[in] riid

Tipo: REFIID

Referencia al IID solicitado de la interfaz que representará el almacén de propiedades creado.

[out] ppv

Tipo: void**

Cuando se devuelve esta función, contiene el puntero de interfaz solicitado en riid. Normalmente, es IPropertyStore.

Valor devuelto

Tipo: HRESULT

Si esta función se realiza correctamente, devuelve S_OK. De lo contrario, devuelve un código de error de HRESULT.

Comentarios

Esta función crea un objeto Component Object Model (COM) que implementa IPropertyStore, INamedPropertyStore, IObjectProvider y IPropertyStoreCapabilities.

Las aplicaciones deben llamar a este objeto solo desde un subproceso a la vez.

Debe inicializar COM con CoInitialize o OleInitialize antes de llamar a PSCreateDelayedMultiplexPropertyStore. COM debe permanecer inicializado durante la vigencia de este objeto.

PSCreateDelayedMultiplexPropertyStore está diseñado como alternativa a PSCreateMultiplexPropertyStore, que requiere que la matriz de almacenes de propiedades se inicialice antes de crear el almacén de propiedades multiplex.

El mecanismo de enlace retrasado está diseñado como una mejora del rendimiento para las llamadas a IPropertyStore::GetValue en un almacén de propiedades multiplex. Cuando se le solicita el valor de una propiedad, el almacén de propiedades multiplex retrasado comprueba cada uno de los almacenes de propiedades para el valor. Una vez encontrado el valor, no es necesario crear e inicializar almacenes posteriores. El almacén de propiedades multiplex retrasado deja de buscar un valor cuando uno de los almacenes de propiedades devuelve un código correcto y un valor que no es de VT_EMPTY.

Cuando el almacén de propiedades multiplex retrasado necesita tener acceso a un almacén de propiedades determinado, primero comprueba si ya ha obtenido una interfaz a ese almacén de propiedades. Si no es así, llama a IDelayedPropertyStoreFactory::GetDelayedPropertyStore con el identificador de almacén de propiedades adecuado para obtener el almacén de propiedades. Siempre usa los identificadores de almacén de propiedades en el orden en que la aplicación los proporciona. Es posible que no se usen todos los identificadores.

Si se produce un error en la llamada a IDelayedPropertyStoreFactory con E_NOTIMPL o E_ACCESSDENIED para un identificador de almacén de propiedades determinado, o si la aplicación especificó GPS_BESTEFFORT, se omite el error y el almacén de propiedades multiplex retrasado pasa al siguiente almacén de propiedades.

En algunos casos, puede ser beneficioso usar PSCreateDelayedMultiplexPropertyStore en lugar de PSCreateMultiplexPropertyStore. Por ejemplo, si una aplicación necesita multiplex dos almacenes de propiedades y el primer almacén de propiedades no consume mucha memoria para inicializar y proporciona información PKEY_Size. A menudo, las aplicaciones que llaman solicitan un almacén de propiedades multiplex y, a continuación, solicitan solo PKEY_Size antes de liberar el objeto. En tal caso, la aplicación podría evitar el costo de inicializar el segundo almacén de propiedades llamando a PSCreateDelayedMultiplexPropertyStore e implementando IDelayedPropertyStoreFactory.

Ejemplos

En el ejemplo siguiente, para incluirse como parte de un programa más grande, se muestra cómo usar PSCreateDelayedMultiplexPropertyStore en una implementación de 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;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP con SP2, Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 con SP1 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado propsys.h
Library Propsys.lib
Archivo DLL Propsys.dll (versión 6.0 o posterior)
Redistribuible Windows Desktop Search (WDS) 3.0

Consulte también

IPropertyStoreFactory

PSCreateMultiplexPropertyStore