Compartilhar via


Função PSCreateDelayedMultiplexPropertyStore (propsys.h)

Cria um repositório de propriedades somente leitura e associação atrasada que contém vários repositórios de propriedades.

Sintaxe

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

Parâmetros

flags

Tipo: GETPROPERTYSTOREFLAGS

Um ou mais valores GETPROPERTYSTOREFLAGS . Esses valores especificam detalhes do objeto de repositório de propriedades criado.

pdpsf

Tipo: IDelayedPropertyStoreFactory*

Ponteiro de interface para uma instância de IDelayedPropertyStoreFactory.

[in] rgStoreIds

Tipo: const DWORD*

Ponteiro para uma matriz de IDs do repositório de propriedades. Essa matriz não precisa ser inicializada.

[in] cStores

Tipo: DWORD

O número de elementos na matriz apontada por rgStoreIds.

[in] riid

Tipo: REFIID

Referência ao IID solicitado da interface que representará o repositório de propriedades criado.

[out] ppv

Tipo: void**

Quando essa função retorna, contém o ponteiro de interface solicitado em riid. Normalmente, isso é IPropertyStore.

Retornar valor

Tipo: HRESULT

Se essa função for bem-sucedida, ela retornará S_OK. Caso contrário, ele retornará um código de erro HRESULT.

Comentários

Essa função cria um objeto COM (Component Object Model) que implementa IPropertyStore, INamedPropertyStore, IObjectProvider e IPropertyStoreCapabilities.

Os aplicativos devem chamar esse objeto de apenas um thread por vez.

Você deve inicializar COM com CoInitialize ou OleInitialize antes de chamar PSCreateDelayedMultiplexPropertyStore. O COM deve permanecer inicializado durante o tempo de vida desse objeto.

PSCreateDelayedMultiplexPropertyStore foi projetado como uma alternativa a PSCreateMultiplexPropertyStore, que exige que a matriz de repositórios de propriedades seja inicializada antes de criar o repositório de propriedades multiplex.

O mecanismo de associação atrasada foi projetado como um aprimoramento de desempenho para chamadas para IPropertyStore::GetValue em um repositório de propriedades multiplex. Quando solicitado o valor de uma propriedade, o repositório de propriedades multiplex atrasado verifica cada um dos repositórios de propriedades quanto ao valor. Depois que o valor for encontrado, não será necessário criar e inicializar repositórios subsequentes. O repositório de propriedades multiplex atrasado para de pesquisar um valor quando um dos repositórios de propriedades retorna um código de êxito e um valor não VT_EMPTY.

Quando o repositório de propriedades multiplex atrasado precisa acessar um repositório de propriedades específico, ele primeiro verifica se ele já obteve uma interface para esse repositório de propriedades. Caso contrário, ele chama IDelayedPropertyStoreFactory::GetDelayedPropertyStore com a ID do repositório de propriedades apropriada para obter o repositório de propriedades. Ele sempre usa as IDs do repositório de propriedades na ordem em que são fornecidas pelo aplicativo. É possível que nem todas as IDs sejam usadas.

Se a chamada para IDelayedPropertyStoreFactory falhar com E_NOTIMPL ou E_ACCESSDENIED para uma ID de repositório de propriedades específica ou se o aplicativo especificado GPS_BESTEFFORT, a falha será ignorada e o repositório de propriedades multiplex atrasado passará para o próximo repositório de propriedades.

Em alguns casos, pode ser benéfico usar PSCreateDelayedMultiplexPropertyStore no lugar de PSCreateMultiplexPropertyStore. Por exemplo, se um aplicativo precisar multiplexar dois repositórios de propriedades e o primeiro repositório de propriedades não tiver uso intensivo de memória para inicializar e fornecer informações de PKEY_Size. Muitas vezes, os aplicativos de chamada solicitam um repositório de propriedades multiplex e solicitam apenas PKEY_Size antes de liberarem o objeto. Nesse caso, o aplicativo poderia evitar o custo de inicializar o segundo repositório de propriedades chamando PSCreateDelayedMultiplexPropertyStore e implementando IDelayedPropertyStoreFactory.

Exemplos

O exemplo a seguir, a ser incluído como parte de um programa maior, demonstra como usar PSCreateDelayedMultiplexPropertyStore em uma implementação 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 Valor
Cliente mínimo com suporte Windows XP com SP2, Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2003 com SP1 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho propsys.h
Biblioteca Propsys.lib
DLL Propsys.dll (versão 6.0 ou posterior)
Redistribuível Pesquisa da Área de Trabalho do Windows (WDS) 3.0

Confira também

IPropertyStoreFactory

PSCreateMultiplexPropertyStore