オブジェクト自身にデータを保存させる機会を与えます。このような設計になっているのではないかと思われます。オブジェクトがIPersistStorageを実装していれば、コンテナはそれを通じて保存などの命令を送ることができます。以下、IPersistStorageのメソッドを順に見ていきます。S_OK;}GetClassIDは、オブジェクトのCLSIDを返すようにします。IPersistStorageはIPersistを継承しているので実装する必要があります。S_FALSE;}IsDirtyは、オブジェクトがダーティ状態であるかを返すようにします。オブジェクトを保存した場合はダーティ状態ではなくなります。S_OK;}InitNewは、オブジェクトに初期化の機会を与えるためにOleUIInsertObjectの内部で呼ばれます。ここでは、引数として渡された構造化ストレージの中にデータ格納用のストリームを作成します。保存時にはメモリの確保を行うべきではないとされているため、ここで行うようにします。構造化ストレージとストリームは他のメソッドで必要になるため、メンバとして保存することになります。オブジェクトのウインドウを閉じた場合に呼ばれます。引数として渡された構造化ストレージにオブジェクトのデータを保存することになります。その後に図形の数だけ位置と長方形であるかどうかのフラグが続きます。これは本来ならfSameAsLoadがFALSEの場合の処理です。今回はこの動作を割愛しています。意味的にはストリームへの書き込みを再開する目的を含んでいます。それはSaveCompletedまで続くべきとされています。意識することはないでしょう。HandsOffStorageで現在のメモリを開放してから、データ格納用のストリームをオープンします。S_OK;}HandsOffStorageは、現在維持しているストレージとストリームのポインタを開放します。基本的にコンテナから呼ばれることはないと思われますが、オブジェクト内ではデストラクタやSaveCompletedから呼ばれています。ユーザーが休止状態のオブジェクトをダブルクリックした場合に呼ばれます。SaveCompletedにpStgを指定することで、この構造化ストレージのストリームを内部でオープンします。これが成功すればストリームのフォーマットに従い、まずは図形の数を取得します。図形の数だけ位置とフラグを取得することになります。