カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

CPersistStreamによる永続性

CPersistStreamはフィルターに永続性を持たせるためのプロパティやバージョン情報を管理するヘルパークラスです。

DECLARE_INTERFACEで定義したIMyFilterインターフェース(後述)とCPersistStreamクラスを継承元に追加します。

class CMyFilter
    : public CTransInPlaceFilter,
      public IMyFilter,
      public CPersistStream

CPersistStreamクラス用に以下の関数をオーバーライドします。

WriteToStream(IStream *pStream)
プロパティを保存します。CPersistStream::Save()関数の中からコールされます。
ReadFromStream(IStream *pStream)
プロパティを読み出します。CPersistStream::Load()関数の中からコールされます。
SizeMax()
保存されるプロパティの最大サイズ(単位:バイト)を戻します。

以下にintのプロパティ2つの例を示します。

変数を定義します。

int m_iParam0;
int m_iParam1;

関数を定義します。

int CMyFilter::SizeMax()
{
    return 2 * sizeof(int);
}

HRESULT CMyFilter::WriteToStream(IStream *pStream)
{
    HRESULT hr;
    WRITEOUT(m_iParam0);
    WRITEOUT(m_iParam1);
    return NOERROR;
}

HRESULT CMyFilter::ReadFromStream(IStream *pStream)
{
    HRESULT hr;
    READIN(m_iParam0);
    READIN(m_iParam1);
    return NOERROR;
}

ヘッダーに以下のマクロを定義します。

#define WRITEOUT(var)  hr = pStream->Write(&var, sizeof(var), NULL); \
               if (FAILED(hr)) return hr;

#define READIN(var)    hr = pStream->Read(&var, sizeof(var), NULL); \
               if (FAILED(hr)) return hr;

intの読み書きにはCPersistStreamクラスのヘルパー関数、WriteInt()・ReadInt()を用いることもできます。ただしこれらの関数はUNICODE文字列を用いていて、変数1つ当り24バイトのエリアを必要とします。SizeMax()で戻すバイト数には注意してください。

以下にWriteInt()・ReadInt()関数の定義を示します。

STDAPI WriteInt(IStream *pIStream, int n);
STDAPI_(int) ReadInt(IStream *pIStream, HRESULT &hr);

プロパティをアプリケーションから読み書きするために以下の関数を用意します。(m_iParam1については省略)

STDMETHODIMP CMyFilter::SetParam0(int iParam0)
{
    m_iParam0 = iParam0;
    return SetDirty(TRUE);
}

パラメータを変更したらSetDirty()関数を引数TRUEにしてコールします。

STDMETHODIMP CMyFilter::GetParam0(int* ipParam0)
{
    *ipParam0 = m_iParam0;
    return NOERROR;
}

ヘッダーの中で関数を定義します。

    STDMETHODIMP    SetParam0(int iParam0);
    STDMETHODIMP    GetParam0(int* ipParam0);

さらにインターフェース用ヘッダーでIMyFilterインターフェースを定義します。

#ifdef __cplusplus
extern "C" {
#endif

DECLARE_INTERFACE_(IMyFilter, IUnknown)
{
    STDMETHOD(SetParam0) (THIS_
                int iParam0
             ) PURE;

    STDMETHOD(GetParam0) (THIS_
                int* ipParam0
             ) PURE;
};

#ifdef __cplusplus
}
#endif

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ