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:
-
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.
-
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.
-
Elimina le proprietà specificate in rgpspec[].
-
Legge i nomi di stringa esistenti associati agli ID delle proprietà specificati nella matrice rgpropid[].
-
Assegna i nomi di stringa specificati nella matrice rglpwstrName agli ID delle proprietà specificati nella matrice rgpropid .
-
Elimina i nomi di stringa degli ID della proprietà specificati nella matrice rgpropid scrivendo NULL nel nome della proprietà.
-
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.
-
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à.
-
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.
-
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 .
-
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.
-
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.
Argomenti correlati