CMemFile クラス
メモリ ファイルをサポートする CFile 派生クラス。
構文
class CMemFile : public CFile
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CMemFile::CMemFile | メモリ ファイル オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CMemFile::Attach | メモリ ブロックを CMemFile にアタッチします。 |
CMemFile::D etach | CMemFile からメモリ ブロックをデタッチし、デタッチされたメモリ ブロックへのポインターを返します。 |
CMemFile::GetBufferPtr | メモリ ファイルをバックアップするメモリ バッファーを取得または書き込みます。 |
保護メソッド
名前 | 説明 |
---|---|
CMemFile::Alloc | メモリ割り当ての動作を変更するには、オーバーライドします。 |
CMemFile::Free | メモリの割り当て解除動作を変更するオーバーライド。 |
CMemFile::GrowFile | ファイルを拡大するときの動作を変更するには、オーバーライドします。 |
CMemFile::Memcpy | ファイルの読み取りと書き込み時のメモリ コピー動作を変更するには、オーバーライドします。 |
CMemFile::Realloc | メモリの再割り当て動作を変更するオーバーライド。 |
解説
これらのメモリ ファイルは、ファイルがディスクではなく RAM に格納されている点を除き、ディスク ファイルと同様に動作します。 メモリ ファイルは、次の場合に役立ちます。
- 高速一時ストレージ
- 独立したプロセス間で生バイトを転送する
- 独立プロセス間でのシリアル化オブジェクトの転送
CMemFile
オブジェクトは、独自のメモリを自動的に割り当てることができます。 または、Attach を呼び出して、CMemFile
オブジェクトに独自のメモリ ブロックをアタッチすることもできます。 どちらの場合も、メモリ ファイルを自動的に拡張するためのメモリは、nGrowBytes
が 0 でない場合は、nGrowBytes
サイズの増分で割り当てられます。
CMemFile
オブジェクトによってメモリが最初に割り当てられた場合、CMemFile
オブジェクトが破棄されると、メモリ ブロックは自動的に削除されます。それ以外の場合は、オブジェクトにアタッチしたメモリの割り当てを解除する必要があります。
Detachを呼び出して、CMemFile
オブジェクトからデタッチするときに指定されたポインターを介してメモリ ブロックにアクセスできます。
CMemFile
の最も一般的な用途は、CMemFile
オブジェクトを作成し、CFile メンバー関数を呼び出して使用することです。 CMemFile
を作成すると自動的に開きます。CFile::Open は呼び出しません。これはディスク ファイルにのみ使用されます。 CMemFile
はディスク ファイルを使用しないため、データ メンバー CFile::m_hFile
は使用されません。
CFile
メンバー関数 Duplicate、LockRange、および UnlockRange は、CMemFile
用に実装されていません。 CMemFile
オブジェクトでこれらの関数を呼び出すと、CNotSupportedExceptionが取得されます。
CMemFile
では、ランタイム ライブラリ関数 malloc、 realloc、 free を使用してメモリの割り当て、再割り当て、割り当て解除を行い、組み込みの memcpy 読み取りと書き込み時にコピー メモリをブロックします。 ファイルを拡張するときにこの動作または動作 CMemFile
変更する場合は、 CMemFile
から独自のクラスを派生させ、適切な関数をオーバーライドします。
CMemFile
の詳細については、MFC のFilesとMemory Management (MFC) に関する記事を参照し、「Run-Time ライブラリ リファレンス」の「File Handling」を参照してください。
継承階層
CMemFile
要件
ヘッダー: afx.h
CMemFile::Alloc
この関数は、 CMemFile
メンバー関数によって呼び出されます。
virtual BYTE* Alloc(SIZE_T nBytes);
パラメーター
nBytes
割り当てられるメモリのバイト数。
戻り値
割り当てられたメモリ ブロックへのポインター。割り当てが失敗した場合は NULL。
解説
カスタム メモリ割り当てを実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、 Free と Realloc もオーバーライドする必要があります。
既定の実装では、ランタイム ライブラリ関数 malloc を使用してメモリを割り当てます。
CMemFile::Attach
メモリ ブロックを CMemFile
にアタッチするには、この関数を呼び出します。
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
パラメーター
lpBuffer
CMemFile
にアタッチするバッファーへのポインター。
nBufferSize
バッファーのサイズをバイト単位で指定する整数。
nGrowBytes
メモリ割り当ての増分 (バイト単位)。
解説
これにより、 CMemFile
はメモリ ファイルとしてメモリ ブロックを使用します。
nGrowBytes が 0 の場合、CMemFile
はファイルの長さを nBufferSize に設定します。 つまり、 CMemFile
にアタッチされる前のメモリ ブロック内のデータがファイルとして使用されます。 この方法で作成されたメモリ ファイルを拡大することはできません。
ファイルを拡張できないため、 CMemFile
がファイルの拡張を試みないように注意してください。 たとえば、CFile:Write のCMemFile
オーバーライドを呼び出して末尾を越えて書き込んだり、長さが nBufferSize より長い CFile:SetLength を呼び出したりしないでください。
nGrowBytes が 0 より大きい場合、CMemFile
はアタッチしたメモリ ブロックの内容を無視します。 CFile::Write
のCMemFile
オーバーライドを使用して、メモリ ファイルの内容を最初から書き込む必要があります。 CFile::SetLength
のCMemFile
オーバーライドを呼び出してファイルの末尾を超えて書き込んだり、ファイルを拡張したりしようとすると、CMemFile
メモリ割り当てが nGrowBytes ずつ増加します。 Attach
に渡すメモリ ブロックが、Alloc と互換性のあるメソッドで割り当てられていない場合、メモリ割り当ての増加は失敗します。 Alloc
の既定の実装と互換性を持つには、ランタイム ライブラリ関数 malloc または calloc を使用してメモリを割り当てる必要があります。
CMemFile::CMemFile
最初のオーバーロードでは、空のメモリ ファイルが開きます。
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
パラメーター
nGrowBytes
メモリ割り当ての増分 (バイト単位)。
lpBuffer サイズ nBufferSize の情報を受け取るバッファーへのポインター。
nBufferSize
ファイル バッファーのサイズをバイト単位で指定する整数。
解説
ファイルはコンストラクターによって開かれます。 CFile::Open を呼び出さないでください。
2 番目のオーバーロードは、最初のコンストラクターを使用し、同じパラメーターで Attach をすぐに呼び出した場合と同じように動作します。 詳細については、Attach
を参照してください。
例
CMemFile f; // Ready to use - no Open necessary.
BYTE * pBuf = (BYTE *)new char [1024];
CMemFile g(pBuf, 1024, 256);
// same as CMemFile g; g.Attach(pBuf, 1024, 256);
CMemFile::D etach
この関数を呼び出して、 CMemFile
によって使用されているメモリ ブロックへのポインターを取得します。
BYTE* Detach();
戻り値
メモリ ファイルの内容を格納しているメモリ ブロックへのポインター。
解説
この関数を呼び出すと、 CMemFile
も閉じます。 メモリ ブロックを再アタッチして CMemFile
するには、 Attach を呼び出します。 ファイルを再アタッチしてそのファイル内のデータを使用する場合は、Detach
を呼び出す前に CFile::GetLength を呼び出してファイルの長さを取得する必要があります。 データ (nGrowBytes
== 0) を使用できるようにメモリ ブロックをCMemFile
にアタッチした場合、メモリ ファイルを拡張することはできません。
CMemFile::Free
この関数は、 CMemFile
メンバー関数によって呼び出されます。
virtual void Free(BYTE* lpMem);
パラメーター
lpMem
割り当てを解除するメモリへのポインター。
解説
カスタム メモリの割り当て解除を実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、 Alloc と Realloc もオーバーライドする必要があります。
CMemFile::GetBufferPtr
メモリ ファイルをバックアップするメモリ バッファーを取得または書き込みます。
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
パラメーター
nCommand
実行する bufferCommand (bufferCheck
、 bufferCommit
、 bufferRead
、または bufferWrite
)。
nCount
nCommandに応じて、読み取り、書き込み、またはコミットするバッファー内のバイト数。 バッファーから読み取る場合は、-1 を指定して、ファイルの現在位置から末尾までのバッファーを返します。
ppBufStart
[out]バッファーの先頭。 nCommand がbufferCommit
されている場合はNULL
する必要があります。
ppBufMax
[out]バッファーの末尾。 nCommand がbufferCommit
されている場合は、NULL
する必要があります。
戻り値
解説
メモリ バッファー (m_nPosition
) 内の現在の位置は、 nCommandに応じて、次の方法で進みます。
nCommand | バッファー位置 |
---|---|
bufferCommit |
現在の位置は、コミットされたバッファーのサイズによって進みます。 |
bufferRead |
現在の位置は、読み取りバッファーのサイズによって進みます。 |
CMemFile::GrowFile
この関数は、いくつかの CMemFile
メンバー関数によって呼び出されます。
virtual void GrowFile(SIZE_T dwNewLen);
パラメーター
dwNewLen
メモリ ファイルの新しいサイズ。
解説
ファイルの拡張方法を変更する場合 CMemFile
オーバーライドできます。 既定の実装ではReallocを呼び出して既存のブロック (または Alloc を拡張してメモリ ブロックを作成し、コンストラクターまたは Attach 呼び出しで指定されたnGrowBytes
値の倍数でメモリを割り当てます。
CMemFile::Memcpy
この関数は、メモリ ファイルとの間でデータを転送するために、CFile::Read および CFile::Write のCMemFile
オーバーライドによって呼び出されます。
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
パラメーター
lpMemTarget
ソース メモリのコピー先となるメモリ ブロックへのポインター。
lpMemSource
ソース メモリ ブロックへのポインター。
nBytes
コピー対象のバイト数。
戻り値
lpMemTargetのコピー。
解説
CMemFile
がこれらのメモリ コピーを実行する方法を変更する場合は、この関数をオーバーライドします。
CMemFile::Realloc
この関数は、 CMemFile
メンバー関数によって呼び出されます。
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
パラメーター
lpMem
再割り当てするメモリ ブロックへのポインター。
nBytes
メモリ ブロックの新しいサイズ。
戻り値
再割り当て (および場合によっては移動) されたメモリ ブロックへのポインター。再割り当てが失敗した場合は NULL。
解説
カスタム メモリの再割り当てを実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、 Alloc と Free もオーバーライドする必要があります。