共用方式為


PSCreateDelayedMultiplexPropertyStore 函式 (propsys.h)

建立包含多個屬性存放區的唯讀延遲系結屬性存放區。

語法

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

參數

flags

類型: GETPROPERTYSTOREFLAGS

一或多個 GETPROPERTYSTOREFLAGS 值。 這些值會指定所建立屬性存放區對象的詳細數據。

pdpsf

類型: IDelayedPropertyStoreFactory*

IDelayedPropertyStoreFactory 實例的介面指標。

[in] rgStoreIds

類型: const DWORD*

屬性存放區標識子陣列的指標。 此陣列不需要初始化。

[in] cStores

類型: DWORD

rgStoreIds 所指向之陣列中的項目數目。

[in] riid

類型: REFIID

將代表所建立屬性存放區之介面之要求的 IID 參考。

[out] ppv

類型: void**

當此函式傳回時,包含 riid中要求的介面指標。 這通常是 IPropertyStore

傳回值

類型: HRESULT

如果此函式成功,則會傳回 S_OK。 否則,它會傳回 HRESULT 錯誤碼。

備註

此函式會建立元件物件模型 (COM) 物件,該物件會實作 IPropertyStoreINamedPropertyStoreIObjectProviderIPropertyStoreCapabilities

應用程式一次只能從一個線程呼叫這個物件。

您必須先使用 CoInitializeOleInitialize 初始化 COM,才能呼叫 PSCreateDelayedMultiplexPropertyStore。 COM 必須在此物件的存留期內保持初始化狀態。

PSCreateDelayedMultiplexPropertyStore 是設計為 PSCreateMultiplexPropertyStore 的替代方案,這需要先初始化屬性存放區陣列,再建立 multiplex 屬性存放區。

延遲的系結機制是設計為在多任務屬性存放區上呼叫 IPropertyStore::GetValue 的效能增強功能。 當要求屬性的值時,延遲的多任務屬性存放區會檢查每個屬性存放區的值。 找到值之後,就不需要建立和初始化後續存放區。 當其中一個屬性存放區傳回成功碼和非VT_EMPTY值時,延遲的 multiplex 屬性存放區會停止搜尋值。

當延遲的多任務屬性存放區需要存取特定屬性存放區時,它會先檢查它是否已取得該屬性存放區的介面。 如果沒有,它會使用適當的屬性存放區標識符來呼叫 IDelayedPropertyStoreFactory::GetDelayedPropertyStore ,以取得屬性存放區。 它一律會依應用程式提供標識碼的順序使用屬性存放區標識碼。 並非所有標識碼都會使用。

如果 呼叫 IDelayedPropertyStoreFactory 失敗,且特定屬性存放區標識碼E_NOTIMPL或E_ACCESSDENIED,或如果指定 GPS_BESTEFFORT的應用程式,則會忽略失敗,而延遲的多任務屬性存放區會移至下一個屬性存放區。

在某些情況下,使用 PSCreateDelayedMultiplexPropertyStore 取代 PSCreateMultiplexPropertyStore 可能會很有説明。 例如,如果應用程式需要多任務兩個屬性存放區,而第一個屬性存放區不是需要大量記憶體才能初始化,並提供PKEY_Size資訊。 通常,呼叫應用程式會要求多任務屬性存放區,然後在釋放物件之前只要求PKEY_Size。 在這種情況下,應用程式可以藉由呼叫 PSCreateDelayedMultiplexPropertyStore 並實作 IDelayedPropertyStoreFactory 來避免初始化第二個屬性存放區的成本。

範例

下列範例要包含在較大的程式中,示範如何在 IPropertyStoreFactory::GetPropertyStore 的實作中使用 PSCreateDelayedMultiplexPropertyStore

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

規格需求

需求
最低支援的用戶端 Windows XP 搭配 SP2、Windows Vista [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 SP1 [僅限傳統型應用程式]
目標平台 Windows
標頭 propsys.h
程式庫 Propsys.lib
Dll Propsys.dll (6.0 版或更新版本)
可轉散發套件 Windows 桌面搜尋 (WDS) 3.0

另請參閱

IPropertyStoreFactory

PSCreateMultiplexPropertyStore