Implementazione autonoma di IPropertyStorage

L'implementazione autonoma del sistema di IPropertySetStorage include un'implementazione di IPropertyStorage, l'interfaccia che legge e scrive le proprietà in un set di proprietà di archiviazione. L'interfaccia IPropertySetStorage crea e apre i set di proprietà in un archivio. Le interfacce IEnumSTATPROPSTG e IEnumSTATPROPSETSTG sono disponibili anche nell'implementazione autonoma.

Per ottenere un puntatore all'implementazione autonoma di IPropertyStorage, chiamare la funzione StgCreatePropStg per creare un nuovo set di proprietà o StgOpenPropStg per ottenere il puntatore dell'interfaccia in un set di proprietà esistente (oppure chiamare i metodi Create o Open dell'implementazione autonoma IPropertySetStorage ).

L'implementazione autonoma di IPropertyStorage crea set di proprietà su qualsiasi oggetto di archiviazione o flusso, non solo su archivi e flussi di file composti. L'implementazione autonoma non dipende dai file composti e può essere usata con qualsiasi implementazione di archiviazioni strutturate. Per altre informazioni sull'implementazione del file composto di questa interfaccia, vedere Implementazione file composta IPropertyStorage-Compound.

Utilizzo

Usare IPropertyStorage per gestire le proprietà all'interno di un singolo set di proprietà. I metodi supportano la lettura, la scrittura e l'eliminazione di proprietà e i nomi di stringa facoltativi che possono essere associati agli ID proprietà. Altri metodi supportano le operazioni di commit standard e ripristinano le operazioni di archiviazione. Esiste anche un metodo che imposta i tempi associati all'archiviazione delle proprietà e un altro che consente l'assegnazione di un CLSID per associare altro codice, ad esempio il codice dell'interfaccia utente, al set di proprietà. Il metodo Enum fornisce un puntatore all'implementazione autonoma di IEnumSTATPROPSTG, che enumera le proprietà nel set.

Formati set di proprietà versione 0 e versione 1

L'implementazione autonoma di IPropertyStorage supporta sia i formati di serializzazione della versione 0 che del set di proprietà versione 1. Per altre informazioni, vedere Serializzazione set di proprietà. I set di proprietà vengono creati in formato 0 e rimangono in tale formato, a meno che non vengano richieste nuove funzionalità. In quel momento, il formato viene aggiornato alla versione 1.

Ad esempio, se un set di proprietà viene creato con il flag di PROPSETFLAG_DEFAULT, il relativo formato è la versione 0. Purché i tipi di proprietà conformi al formato versione 0 vengano scritti in e letti da tale set di proprietà, il set di proprietà rimane in formato versione 0. Se un tipo di proprietà versione 1 viene scritto nel set di proprietà, il set di proprietà viene aggiornato automaticamente alla versione 1. Successivamente, tale set di proprietà non può più essere letto dalle implementazioni che comprendono solo la versione 0.

Tipi IPropertyStorage e Variant

L'implementazione autonoma di IPropertyStorage non supporta i tipi varianti VT_UNKNOWN o VT_DISPATCH nel membro vt della struttura PROPVARIANT .

I tipi varianti seguenti sono supportati all'interno di un safeArray; ovvero, questi valori possono essere combinati con VT_ARRAY nel membro vt della struttura PROPVARIANT .

Tipi varianti supportati all'interno di SafeArray per implementazione di file composti di IPropertyStorage

VT_I1

VT_UI1

VT_I2

VT_UI2

VT_I4

VT_UI4

VT_INT

VT_UINT

VT_R4

VT_R8

VT_CY

VT_DATE

VT_BSTR

VT_BOOL

VT_DECIMAL

VT_ERROR

VT_VARIANT

 

 

Quando VT_VARIANT viene combinato con VT_ARRAY, SafeArray contiene strutture PROPVARIANT . Tuttavia, i tipi di questi elementi devono essere presi dall'elenco precedente, non possono essere VT_VARIANT e non possono includere i VT_VECTOR, VT_ARRAY o VT_BYREF indicatori.

Metodi IPropertyStorage

L'implementazione autonoma di IPropertyStorage supporta i metodi seguenti:

IPropertyStorage::ReadMultiple

Legge le proprietà specificate nella matrice rgpspec e fornisce i valori di tutte le proprietà valide nella matrice rgvar di elementi PROPVARIANT .

Nell'implementazione autonoma del sistema, gli identificatori di proprietà duplicati che fanno riferimento a tipi di flusso o di archiviazione comportano più chiamate a IStorage::OpenStream o IStorage::OpenStorage::OpenStorage e l'esito positivo o negativo di ReadMultiple dipende dalla capacità dell'implementazione di archiviazione sottostante di condividere le risorse di archiviazione aperte.

Inoltre, per garantire l'operazione thread-safe se la stessa proprietà con valore di flusso o archiviazione viene richiesta più volte tramite lo stesso puntatore IPropertyStorage , l'apertura avrà esito positivo o negativo a seconda che la proprietà sia già aperta e su se il file system sottostante gestisce più apertura di un flusso o archiviazione. Pertanto, l'operazione ReadMultiple in una proprietà con valori di flusso o archiviazione genera sempre una chiamata a IStorage::OpenStream o IStorage::OpenStorage, passando l'accesso (STGM_READWRITE, ad esempio) e condividere i valori (STGM_SHARE_EXCLUSIVE, ad esempio) specificati quando il set di proprietà è stato originariamente aperto o creato.

Se il metodo ha esito negativo, i valori scritti in rgvar[] non sono definiti. Se alcune proprietà con valori di flusso o di archiviazione vengono aperte correttamente, ma prima del completamento dell'esecuzione, queste proprietà devono essere rilasciate prima che il metodo restituisca.

IPropertyStorage::WriteMultiple

Scrive le proprietà specificate nella matrice rgpspec[] assegnandole i tag e i valori PROPVARIANT specificati in rgvar[]. Le proprietà già esistenti vengono assegnate ai valori PROPVARIANT specificati e le proprietà che non esistono attualmente vengono create.

IPropertyStorage::D eleteMultiple

Elimina le proprietà specificate in rgpspec[].

IPropertyStorage::ReadPropertyNames

Legge i nomi di stringa esistenti associati agli ID delle proprietà specificati nella matrice rgpropid[].

IPropertyStorage::WritePropertyNames

Assegna i nomi di stringa specificati nella matrice rglpwstrName agli ID delle proprietà specificati nella matrice rgpropid .

IPropertyStorage::D eletePropertyNames

Elimina i nomi di stringa degli ID della proprietà specificati nella matrice rgpropid scrivendo NULL nel nome della proprietà.

IPropertyStorage::SetClass

Imposta IL CLSID del flusso del set di proprietà. Nell'implementazione autonoma impostare CLSID su un set di proprietà nonsimple (uno che può contenere proprietà con valori di archiviazione o di flusso, come descritto in IPropertySetStorage::Create) imposta anche CLSID sulla sottostorage sottostante in modo che possa essere ottenuto tramite una chiamata a IStorage::Stat.

IPropertyStorage::Commit

Per set di proprietà semplici e nonsimple, scarica l'immagine di memoria nel sottosistema del disco. Inoltre, per i set di proprietà transacted-mode nonsimple, questo metodo chiama IStorage::Commit nel set di proprietà.

IPropertyStorage::Revert

Solo per i set di proprietà nonsimple, chiama il metodo Revert dell'archiviazione sottostante e riapri il flusso "contenuto". Per i set di proprietà semplici, restituisce solo E_OK.

IPropertyStorage::Enum

Crea un oggetto enumeratore che implementa IEnumSTATPROPSTG, i metodi di cui è possibile chiamare per enumerare le strutture STATPROPSTG che forniscono informazioni su ognuna delle proprietà nel set.

Questa implementazione crea una matrice in cui viene letto l'intero set di proprietà e che può essere condiviso quando viene chiamato IEnumSTATPROPSTG::Clone .

IPropertyStorage::Stat

Compila i membri di una struttura STATPROPSETSTG , che contiene informazioni sull'intero set di proprietà. In caso di restituzione, fornisce un puntatore alla struttura.

Per i set di archiviazione nonsimple, questa implementazione chiama IStorage::Stat (o IStream::Stat) per ottenere le informazioni dall'archiviazione o dal flusso sottostante.

IPropertyStorage::SetTimes

Solo per i set di proprietà nonsimple, imposta i tempi supportati dall'archiviazione sottostante. Questa implementazione di SetTimes chiama il metodo IStorage::SetElementTimes dell'archiviazione sottostante per modificare i tempi. Supporta i tempi supportati dal metodo sottostante che possono essere tempo di modifica, tempo di accesso o tempo di creazione.

Implementazione autonoma di IPropertySetStorage-Stand-alone

IPropertyStorage

IStorage::SetElementTimes

StgOpenPropStg

StgCreatePropStg

StgCreatePropSetStg