Freigeben über


PSCreateDelayedMultiplexPropertyStore-Funktion (propsys.h)

Erstellt einen schreibgeschützten, verzögerten Bindungseigenschaftenspeicher, der mehrere Eigenschaftenspeicher enthält.

Syntax

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

Parameter

flags

Typ: GETPROPERTYSTOREFLAGS

Mindestens ein GETPROPERTYSTOREFLAGS-Wert . Diese Werte geben Details des erstellten Eigenschaftenspeicherobjekts an.

pdpsf

Typ: IDelayedPropertyStoreFactory*

Schnittstellenzeiger auf eine instance von IDelayedPropertyStoreFactory.

[in] rgStoreIds

Typ: const DWORD*

Zeiger auf ein Array von Eigenschaftenspeicher-IDs. Dieses Array muss nicht initialisiert werden.

[in] cStores

Art: DWORD

Die Anzahl der Elemente im Array, auf die von rgStoreIds verwiesen wird.

[in] riid

Typ: REFIID

Verweis auf die angeforderte IID der Schnittstelle, die den erstellten Eigenschaftenspeicher darstellt.

[out] ppv

Typ: void**

Wenn diese Funktion zurückgibt, enthält den in riid angeforderten Schnittstellenzeiger. Dies ist in der Regel IPropertyStore.

Rückgabewert

Typ: HRESULT

Wenn diese Funktion erfolgreich ist, wird S_OK zurückgegeben. Andernfalls wird ein Fehlercode HRESULT zurückgegeben.

Hinweise

Diese Funktion erstellt ein COM-Objekt (Component Object Model), das IPropertyStore, INamedPropertyStore, IObjectProvider und IPropertyStoreCapabilities implementiert.

Anwendungen müssen dieses Objekt jeweils nur aus einem Thread aufrufen.

Sie müssen COM mit CoInitialize oder OleInitialize initialisieren , bevor Sie PSCreateDelayedMultiplexPropertyStore aufrufen. COM muss für die Lebensdauer dieses Objekts initialisiert bleiben.

PSCreateDelayedMultiplexPropertyStore ist als Alternative zu PSCreateMultiplexPropertyStore konzipiert. Dies erfordert, dass das Array von Eigenschaftenspeichern initialisiert wird, bevor der Multiplex-Eigenschaftenspeicher erstellt wird.

Der Mechanismus für verzögerte Bindung ist als Leistungsverbesserung für Aufrufe von IPropertyStore::GetValue in einem Multiplex-Eigenschaftenspeicher konzipiert. Wenn Sie nach dem Wert einer Eigenschaft gefragt werden, überprüft der verzögerte Multiplex-Eigenschaftenspeicher jeden der Eigenschaftenspeicher auf den Wert. Nachdem der Wert gefunden wurde, müssen keine nachfolgenden Speicher erstellt und initialisiert werden. Der verzögerte Multiplex-Eigenschaftenspeicher beendet die Suche nach einem Wert, wenn einer der Eigenschaftenspeicher einen Erfolgscode und einen nicht VT_EMPTY Wert zurückgibt.

Wenn der verzögerte Multiplex-Eigenschaftenspeicher auf einen bestimmten Eigenschaftenspeicher zugreifen muss, überprüft er zunächst, ob er bereits eine Schnittstelle zu diesem Eigenschaftenspeicher abgerufen hat. Andernfalls wird IDelayedPropertyStoreFactory::GetDelayedPropertyStore mit der entsprechenden Eigenschaftenspeicher-ID aufgerufen, um den Eigenschaftenspeicher abzurufen. Die Eigenschaftenspeicher-IDs werden immer in der Reihenfolge verwendet, in der sie von der Anwendung bereitgestellt werden. Es ist möglich, dass nicht alle IDs verwendet werden.

Wenn der Aufruf von IDelayedPropertyStoreFactory mit E_NOTIMPL oder E_ACCESSDENIED für eine bestimmte Eigenschaftenspeicher-ID fehlschlägt oder wenn die Anwendung GPS_BESTEFFORT angegeben hat, wird der Fehler ignoriert, und der verzögerte Multiplex-Eigenschaftenspeicher wechselt zum nächsten Eigenschaftenspeicher.

In einigen Fällen kann es vorteilhaft sein, PSCreateDelayedMultiplexPropertyStore anstelle von PSCreateMultiplexPropertyStore zu verwenden. Beispiel: Eine Anwendung muss zwei Eigenschaftenspeicher multiplexen, und der erste Eigenschaftenspeicher ist für die Initialisierung nicht speicherintensiv und stellt PKEY_Size Informationen bereit. Häufig fragen aufrufende Anwendungen nach einem Multiplex-Eigenschaftenspeicher und dann nur nach PKEY_Size, bevor sie das Objekt freigeben. In einem solchen Fall könnte die Anwendung die Kosten für die Initialisierung des zweiten Eigenschaftenspeichers vermeiden, indem sie PSCreateDelayedMultiplexPropertyStore aufruft und IDelayedPropertyStoreFactory implementiert.

Beispiele

Im folgenden Beispiel, das als Teil eines größeren Programms eingeschlossen werden soll, wird veranschaulicht, wie PSCreateDelayedMultiplexPropertyStore in einer Implementierung von IPropertyStoreFactory::GetPropertyStore verwendet wird.

// 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;
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP mit SP2, Windows Vista [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 mit SP1 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile propsys.h
Bibliothek Propsys.lib
DLL Propsys.dll (Version 6.0 oder höher)
Verteilbare Komponente Windows Desktop Search (WDS) 3.0

Weitere Informationen

IPropertyStoreFactory

PSCreateMultiplexPropertyStore