Partager via


Fonction PSCreateDelayedMultiplexPropertyStore (propsys.h)

Crée un magasin de propriétés de liaison différée en lecture seule qui contient plusieurs magasins de propriétés.

Syntaxe

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

Paramètres

flags

Type : GETPROPERTYSTOREFLAGS

Une ou plusieurs valeurs GETPROPERTYSTOREFLAGS . Ces valeurs spécifient les détails de l’objet de magasin de propriétés créé.

pdpsf

Type : IDelayedPropertyStoreFactory*

Pointeur d’interface vers un instance de IDelayedPropertyStoreFactory.

[in] rgStoreIds

Type : const DWORD*

Pointeur vers un tableau d’ID de magasin de propriétés. Ce tableau n’a pas besoin d’être initialisé.

[in] cStores

Type : DWORD

Nombre d’éléments dans le tableau pointé vers rgStoreIds.

[in] riid

Type : REFIID

Référence à l’IID demandé de l’interface qui représentera le magasin de propriétés créé.

[out] ppv

Type : void**

Lorsque cette fonction retourne, contient le pointeur d’interface demandé dans riid. Il s’agit généralement d’IPropertyStore.

Valeur retournée

Type : HRESULT

Si cette fonction réussit, elle retourne S_OK. Sinon, elle retourne un code d’erreur HRESULT.

Remarques

Cette fonction crée un objet COM (Component Object Model) qui implémente IPropertyStore, INamedPropertyStore, IObjectProvider et IPropertyStoreCapabilities.

Les applications doivent appeler cet objet à partir d’un seul thread à la fois.

Vous devez initialiser COM avec CoInitialize ou OleInitialize avant d’appeler PSCreateDelayedMultiplexPropertyStore. COM doit rester initialisé pendant la durée de vie de cet objet.

PSCreateDelayedMultiplexPropertyStore est conçu comme une alternative à PSCreateMultiplexPropertyStore, ce qui nécessite l’initialisation du tableau des magasins de propriétés avant de créer le magasin de propriétés multiplex.

Le mécanisme de liaison différée est conçu comme une amélioration des performances pour les appels à IPropertyStore ::GetValue sur un magasin de propriétés multiplex. Lorsque vous êtes invité à indiquer la valeur d’une propriété, le magasin de propriétés multiplex différée vérifie la valeur de chacun des magasins de propriétés. Une fois la valeur trouvée, il n’est plus nécessaire de créer et d’initialiser les magasins suivants. Le magasin de propriétés multiplex différée arrête la recherche d’une valeur quand l’un des magasins de propriétés retourne un code de réussite et une valeur non VT_EMPTY.

Lorsque le magasin de propriétés multiplex retardé doit accéder à un magasin de propriétés particulier, il vérifie d’abord s’il a déjà obtenu une interface pour ce magasin de propriétés. Si ce n’est pas le cas, il appelle IDelayedPropertyStoreFactory ::GetDelayedPropertyStore avec l’ID de magasin de propriétés approprié pour obtenir le magasin de propriétés. Il utilise toujours les ID du magasin de propriétés dans l’ordre dans lequel ils sont fournis par l’application. Il est possible que tous les ID ne soient pas utilisés.

Si l’appel à IDelayedPropertyStoreFactory échoue avec E_NOTIMPL ou E_ACCESSDENIED pour un ID de magasin de propriétés particulier, ou si l’application spécifiée GPS_BESTEFFORT, l’échec est ignoré et le magasin de propriétés multiplex retardé passe au magasin de propriétés suivant.

Dans certains cas, il peut être utile d’utiliser PSCreateDelayedMultiplexPropertyStore à la place de PSCreateMultiplexPropertyStore. Par exemple, si une application doit multiplexer deux magasins de propriétés et que le premier magasin de propriétés ne nécessite pas de mémoire pour l’initialiser et fournit des informations PKEY_Size. Souvent, les applications appelantes demandent un magasin de propriétés multiplex, puis demandent uniquement PKEY_Size avant de libérer l’objet. Dans ce cas, l’application peut éviter le coût d’initialisation du deuxième magasin de propriétés en appelant PSCreateDelayedMultiplexPropertyStore et en implémentant IDelayedPropertyStoreFactory.

Exemples

L’exemple suivant, à inclure dans le cadre d’un programme plus grand, montre comment utiliser PSCreateDelayedMultiplexPropertyStore dans une implémentation 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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP avec SP2, Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2003 avec SP1 [applications de bureau uniquement]
Plateforme cible Windows
En-tête propsys.h
Bibliothèque Propsys.lib
DLL Propsys.dll (version 6.0 ou ultérieure)
Composant redistribuable Windows Desktop Search (WDS) 3.0

Voir aussi

IPropertyStoreFactory

PSCreateMultiplexPropertyStore