Condividi tramite


Funzione PSCreateDelayedMultiplexPropertyStore (propsys.h)

Crea un archivio delle proprietà di sola lettura e associazione ritardata che contiene più archivi di proprietà.

Sintassi

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

Parametri

flags

Tipo: GETPROPERTYSTOREFLAGS

Uno o più valori GETPROPERTYSTOREFLAGS . Questi valori specificano i dettagli dell'oggetto archivio proprietà creato.

pdpsf

Tipo: IDelayedPropertyStoreFactory*

Puntatore di interfaccia a un'istanza di IDelayedPropertyStoreFactory.

[in] rgStoreIds

Tipo: const DWORD*

Puntatore a una matrice di ID dell'archivio delle proprietà. Questa matrice non deve essere inizializzata.

[in] cStores

Tipo: DWORD

Numero di elementi nella matrice a cui punta rgStoreIds.

[in] riid

Tipo: REFIID

Riferimento all'IID richiesto dell'interfaccia che rappresenta l'archivio delle proprietà create.

[out] ppv

Tipo: void**

Quando questa funzione restituisce, contiene il puntatore dell'interfaccia richiesto in riid. Questo è in genere IPropertyStore.

Valore restituito

Tipo: HRESULT

Se questa funzione ha esito positivo, restituisce S_OK. In caso contrario, restituisce un codice di errore HRESULT .

Commenti

Questa funzione crea un oggetto Component Object Model (COM) che implementa IPropertyStore, INamedPropertyStore, IObjectProvider e IPropertyStoreCapabilities.

Le applicazioni devono chiamare questo oggetto da un solo thread alla volta.

È necessario inizializzare COM con CoInitialize o OleInitialize prima di chiamare PSCreateDelayedMultiplexPropertyStore. COM deve rimanere inizializzato per la durata di questo oggetto.

PSCreateDelayedMultiplexPropertyStore è progettato come alternativa a PSCreateMultiplexPropertyStore, che richiede che la matrice di archivi di proprietà venga inizializzata prima di creare l'archivio delle proprietà multiplex.

Il meccanismo di associazione ritardato è progettato come miglioramento delle prestazioni per le chiamate a IPropertyStore::GetValue in un archivio delle proprietà multiplex. Quando viene richiesto il valore di una proprietà, l'archivio proprietà multiplex ritardato controlla ognuna delle proprietà archivia per il valore. Dopo aver trovato il valore, non è necessario creare e inizializzare gli archivi successivi. L'archivio proprietà multiplex ritardato interrompe la ricerca di un valore quando uno degli archivi di proprietà restituisce un codice riuscito e un valore non VT_EMPTY.

Quando l'archivio delle proprietà multiplex ritardato deve accedere a un archivio di proprietà specifico, verifica prima di tutto se ha già ottenuto un'interfaccia all'archivio delle proprietà. In caso contrario, chiama IDelayedPropertyStoreFactory::GetDelayedPropertyStore con l'ID archivio delle proprietà appropriato per ottenere l'archivio delle proprietà. Usa sempre gli ID dell'archivio delle proprietà nell'ordine in cui vengono forniti dall'applicazione. È possibile che non vengano usati tutti gli ID.

Se la chiamata a IDelayedPropertyStoreFactory ha esito negativo con E_NOTIMPL o E_ACCESSDENIED per un DETERMINATO ID archivio proprietà o se l'applicazione specificata GPS_BESTEFFORT, l'errore viene ignorato e l'archivio proprietà multiplex ritardato passa all'archivio delle proprietà successivo.

In alcuni casi, potrebbe essere utile usare PSCreateDelayedMultiplexPropertyStore al posto di PSCreateMultiplexPropertyStore. Ad esempio, se un'applicazione deve piùx due archivi delle proprietà e il primo archivio delle proprietà non è intensivo per inizializzare e fornire informazioni PKEY_Size. Spesso, le applicazioni chiamano un archivio di proprietà multiplex e quindi chiedere solo PKEY_Size prima di rilasciare l'oggetto. In tal caso, l'applicazione potrebbe evitare il costo di inizializzare il secondo archivio proprietà chiamando PSCreateDelayedMultiplexPropertyStore e implementando IDelayedPropertyStoreFactory.

Esempio

L'esempio seguente, da includere come parte di un programma più grande, illustra come usare PSCreateDelayedMultiplexPropertyStore in un'implementazione di 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;
}

Requisiti

Requisito Valore
Client minimo supportato Windows XP con SP2, Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2003 con SP1 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione propsys.h
Libreria Propsys.lib
DLL Propsys.dll (versione 6.0 o successiva)
Componente ridistribuibile Windows Desktop Search (WDS) 3.0

Vedi anche

IPropertyStoreFactory

PSCreateMultiplexPropertyStore