IPropertyStorage-スタンドアロンの実装

IPropertySetStorage のシステム提供のスタンドアロン実装には、プロパティ セット ストレージ内のプロパティの読み取りと書き込みを行うインターフェイスである IPropertyStorage の実装が含まれています。 IPropertySetStorage インターフェイスは、ストレージ内にプロパティ セットを作成して開きます。 IEnumSTATPROPSTG インターフェイスと IEnumSTATPROPSETSTG インターフェイスは、スタンドアロン実装でも提供されます。

IPropertyStorage のスタンドアロン実装へのポインターを取得するには、StgCreatePropStg 関数を呼び出して新しいプロパティ セットを作成するか、StgOpenPropStg を呼び出して、既存のプロパティ セットのインターフェイス ポインターを取得します (または、IPropertySetStorage スタンドアロン実装の Create メソッドまたは Open メソッドを呼び出します)。

IPropertyStorage のスタンドアロン実装では、複合ファイル ストレージやストリームだけでなく、任意のストレージまたはストリーム オブジェクトにプロパティ セットが作成されます。 スタンドアロン実装は複合ファイルに依存せず、構造化ストレージの任意の実装で使用できます。 このインターフェイスの複合ファイルの実装の詳細については、「 IPropertyStorage-Compound File Implementation」を参照してください。

使用するタイミング

IPropertyStorage を使用して、1 つのプロパティ セット内のプロパティを管理します。 そのメソッドは、プロパティ ID に関連付けることができるプロパティと省略可能な文字列名の両方の読み取り、書き込み、削除をサポートします。 その他の方法では、標準のコミット操作と元に戻すストレージ操作がサポートされています。 また、プロパティ ストレージに関連付けられた時間を設定するメソッドと、CLSID の割り当てを使用して、ユーザー インターフェイス コードなどの他のコードをプロパティ セットに関連付けることができます。 Enum メソッドは、セット内のプロパティを列挙する IEnumSTATPROPSTG のスタンドアロン実装へのポインターを提供します。

バージョン 0 およびバージョン 1 のプロパティ セットの形式

IPropertyStorage のスタンドアロン実装では、バージョン 0 とバージョン 1 の両方のプロパティ セットのシリアル化形式がサポートされています。 詳細については、「 プロパティ セットのシリアル化」を参照してください。 プロパティ セットはバージョン 0 形式で作成され、新機能が要求されない限りその形式のままです。 その時点で、形式はバージョン 1 に更新されます。

たとえば、プロパティ セットが PROPSETFLAG_DEFAULT フラグを使用して作成された場合、その形式はバージョン 0 になります。 バージョン 0 形式に準拠するプロパティ型が、そのプロパティ セットに書き込まれ、そのプロパティ セットから読み取られている限り、プロパティ セットはバージョン 0 形式のままです。 バージョン 1 のプロパティ型がプロパティ セットに書き込まれる場合、プロパティ セットはバージョン 1 に自動的に更新されます。 その後、バージョン 0 のみを理解する実装では、そのプロパティ セットを読み取ることができなくなりました。

IPropertyStorage 型とバリアント型

IPropertyStorage のスタンドアロン実装では、PROPVARIANT 構造体の vt メンバーにVT_UNKNOWNまたはVT_DISPATCHバリアント型はサポートされていません。

SafeArray 内では、次のバリアント型がサポートされています。つまり、これらの値は PROPVARIANT 構造体の vt メンバー内のVT_ARRAYと組み合わせることができます。

IPropertyStorage の複合ファイル実装によって SafeArray 内でサポートされるバリアント型

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

 

 

VT_VARIANTをVT_ARRAYと組み合わせると、SafeArray 自体は PROPVARIANT 構造体を保持します。 ただし、これらの要素の型は、上記のリストから取得する必要があり、VT_VARIANTすることはできません。また、VT_VECTOR、VT_ARRAY、またはVT_BYREFインジケーターを含めることはできません。

IPropertyStorage メソッド

IPropertyStorage のスタンドアロン実装では、次のメソッドがサポートされています。

IPropertyStorage::ReadMultiple

rgpspec 配列で指定されたプロパティを読み取り、PROPVARIANT 要素の rgvar 配列内のすべての有効なプロパティの値を提供します。

システム提供のスタンドアロン実装では、ストリームまたはストレージの種類を参照する重複するプロパティ識別子によって、IStorage::OpenStream または IStorage::OpenStorage が複数回呼び出され、ReadMultiple の成功または失敗は、基になるストレージ実装がオープン ストレージを共有する機能によって異なります。

さらに、同じ IPropertyStorage ポインターを介して同じストリーム値プロパティまたはストレージ値プロパティが複数回要求された場合、プロパティが既に開いているかどうか、および基になるファイル システムがストリームまたはストレージの複数のオープンを処理するかどうかに応じて、オープンは成功または失敗します。 したがって、ストリーム値プロパティまたはストレージ値プロパティに対する ReadMultiple 操作では、常に IStorage::OpenStream、または IStorage::OpenStorage が呼び出され、プロパティ セットが最初に開かれたか作成されたときに指定されたアクセス (たとえば、STGM_READWRITE) と共有値 (STGM_SHARE_EXCLUSIVE) が渡されます。

メソッドが失敗した場合、 rgvar[] に書き込まれた値は未定義です。 ストリーム値またはストレージ値のプロパティが正常に開かれたが、実行が完了する前にエラーが発生した場合は、メソッドが戻る前にこれらのプロパティを解放する必要があります。

IPropertyStorage::WriteMultiple

rgpspec[] 配列で指定されたプロパティを書き込み、rgvar[] で指定された PROPVARIANT タグと値を割り当てます。 既に存在するプロパティには、指定された PROPVARIANT 値が割り当てられ、現在存在しないプロパティが作成されます。

IPropertyStorage::D eleteMultiple

rgpspec[]で指定されたプロパティを削除します。

IPropertyStorage::ReadPropertyNames

rgpropid[] 配列で指定されたプロパティ ID に関連付けられている既存の文字列名を読み取ります。

IPropertyStorage::WritePropertyNames

rglpwstrName 配列で指定された文字列名を、rgpropid 配列で指定されたプロパティ ID に割り当てます。

IPropertyStorage::D eletePropertyNames

プロパティ名に NULL を書き込んで、rgpropid 配列で指定されたプロパティ ID の文字列名を削除します。

IPropertyStorage::SetClass

プロパティ セット ストリームの CLSID を設定します。 スタンドアロン実装では、非シンプル プロパティ セット ( IPropertySetStorage::Create で説明されているように、ストレージまたはストリーム値のプロパティを含めることができるプロパティ) に CLSID を設定すると、基になるサブストレージの CLSID も設定され、 IStorage::Stat の呼び出しを通じて取得できるようになります。

IPropertyStorage::Commit

単純プロパティ セットと非単純プロパティ セットの両方について、メモリ イメージをディスク サブシステムにフラッシュします。 さらに、非simple transacted-mode プロパティ セットの場合、このメソッドはプロパティ セットに対して IStorage::Commit を呼び出します。

IPropertyStorage::Revert

非シンプル プロパティ セットの場合のみ、基になるストレージの Revert メソッドを呼び出し、'contents' ストリームを再度開きます。 単純なプロパティ セットの場合は、E_OKのみを返します。

IPropertyStorage::Enum

IEnumSTATPROPSTG を実装する列挙子オブジェクトを作成します。そのメソッドを呼び出して、セット内の各プロパティに関する情報を提供する STATPROPSTG 構造体を列挙できます。

この実装では、プロパティ セット全体が読み取られ、 IEnumSTATPROPSTG::Clone が呼び出されたときに共有できる配列が作成されます。

IPropertyStorage::Stat

STATPROPSETSTG 構造体のメンバーを入力します。この構造体には、プロパティ セット全体に関する情報が含まれます。 戻り値として、 構造体へのポインターを提供します。

非シンプル ストレージ セットの場合、この実装では IStorage::Stat (または IStream::Stat) を呼び出して、基になるストレージまたはストリームから情報を取得します。

IPropertyStorage::SetTimes

非シンプル プロパティ セットの場合のみ、基になるストレージでサポートされる時間を設定します。 この SetTimes の実装では、基になるストレージの IStorage::SetElementTimes メソッドを呼び出して時刻を変更します。 これは、変更時刻、アクセス時間、または作成時間など、基になるメソッドでサポートされる時間をサポートします。

IPropertySetStorage-スタンドアロン実装

IPropertyStorage

IStorage::SetElementTimes

StgOpenPropStg

StgCreatePropStg

StgCreatePropSetStg