次の方法で共有


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メンバー関数 DuplicateLockRange、および UnlockRange は、CMemFile用に実装されていません。 CMemFile オブジェクトでこれらの関数を呼び出すと、CNotSupportedExceptionが取得されます。

CMemFile では、ランタイム ライブラリ関数 mallocreallocfree を使用してメモリの割り当て、再割り当て、割り当て解除を行い、組み込みの memcpy 読み取りと書き込み時にコピー メモリをブロックします。 ファイルを拡張するときにこの動作または動作 CMemFile 変更する場合は、 CMemFile から独自のクラスを派生させ、適切な関数をオーバーライドします。

CMemFileの詳細については、MFC のFilesMemory Management (MFC) に関する記事を参照し、「Run-Time ライブラリ リファレンス」の「File Handling」を参照してください

継承階層

CObject

CFile

CMemFile

要件

ヘッダー: afx.h

CMemFile::Alloc

この関数は、 CMemFile メンバー関数によって呼び出されます。

virtual BYTE* Alloc(SIZE_T nBytes);

パラメーター

nBytes
割り当てられるメモリのバイト数。

戻り値

割り当てられたメモリ ブロックへのポインター。割り当てが失敗した場合は NULL。

解説

カスタム メモリ割り当てを実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、 FreeRealloc もオーバーライドする必要があります。

既定の実装では、ランタイム ライブラリ関数 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:WriteCMemFileオーバーライドを呼び出して末尾を越えて書き込んだり、長さが nBufferSize より長い CFile:SetLength を呼び出したりしないでください。

nGrowBytes が 0 より大きい場合、CMemFileはアタッチしたメモリ ブロックの内容を無視します。 CFile::WriteCMemFileオーバーライドを使用して、メモリ ファイルの内容を最初から書き込む必要があります。 CFile::SetLengthCMemFileオーバーライドを呼び出してファイルの末尾を超えて書き込んだり、ファイルを拡張したりしようとすると、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
割り当てを解除するメモリへのポインター。

解説

カスタム メモリの割り当て解除を実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、 AllocRealloc もオーバーライドする必要があります。

CMemFile::GetBufferPtr

メモリ ファイルをバックアップするメモリ バッファーを取得または書き込みます。

virtual UINT GetBufferPtr(
    UINT nCommand,
    UINT nCount = 0,
    void** ppBufStart = NULL,
    void** ppBufMax = NULL
);

パラメーター

nCommand
実行する bufferCommand (bufferCheckbufferCommitbufferRead、または bufferWrite )。

nCount
nCommandに応じて、読み取り、書き込み、またはコミットするバッファー内のバイト数。 バッファーから読み取る場合は、-1 を指定して、ファイルの現在位置から末尾までのバッファーを返します。

ppBufStart
[out]バッファーの先頭。 nCommandbufferCommitされている場合はNULLする必要があります。

ppBufMax
[out]バッファーの末尾。 nCommand がbufferCommitされている場合は、NULLする必要があります。

戻り値

command value 戻り値
buffercheck ダイレクト バッファリングがサポートされている場合はbufferDirect を返します。それ以外の場合は 0 を返します。
bufferCommit 0 を返します。
bufferRead または bufferWrite 返されたバッファー領域のバイト数を返します。 ppBufStart および ppBufMax は、読み取り/書き込みバッファーの開始と終了を指します。

解説

メモリ バッファー (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::WriteCMemFileオーバーライドによって呼び出されます。

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。

解説

カスタム メモリの再割り当てを実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、 AllocFree もオーバーライドする必要があります。

関連項目

CFile クラス
階層図