CMemFile-Klasse
Die von CFile abgeleitete Klasse, die Speicherdateien unterstützt.
Syntax
class CMemFile : public CFile
Member
Öffentliche Konstruktoren
Name | Beschreibung |
---|---|
CMemFile::CMemFile | Erstellt ein Speicherdateiobjekt. |
Öffentliche Methoden
Name | Beschreibung |
---|---|
CMemFile::Attach | Fügt einen Speicherblock an CMemFile . |
CMemFile::D etach | Trennt den Speicherblock und CMemFile gibt einen Zeiger auf den Speicherblock zurück, der getrennt ist. |
CMemFile::GetBufferPtr | Dient zum Abrufen oder Schreiben in den Speicherpuffer, der eine Speicherdatei zurückgibt. |
Geschützte Methoden
Name | Beschreibung |
---|---|
CMemFile::Alloc | AußerKraftsetzung zum Ändern des Speicherzuweisungsverhaltens. |
CMemFile::Free | Außerkraftsetzung zum Ändern des Speicher-Deallocation-Verhaltens. |
CMemFile::GrowFile | Überschreiben, um das Verhalten beim Anbau einer Datei zu ändern. |
CMemFile::Memcpy | Außerkraftsetzung zum Ändern des Speicherkopieverhaltens beim Lesen und Schreiben von Dateien. |
CMemFile::Realloc | Überschreiben, um das Speicher-Relocation-Verhalten zu ändern. |
Hinweise
Diese Speicherdateien verhalten sich wie Datenträgerdateien, außer dass die Datei im RAM und nicht auf dem Datenträger gespeichert ist. Eine Speicherdatei ist nützlich für:
- Schneller temporärer Speicher
- Übertragen von Rohbytes zwischen unabhängigen Prozessen
- Übertragen serialisierter Objekte zwischen unabhängigen Prozessen
CMemFile
Objekte können automatisch ihren eigenen Speicher zuordnen. Sie können auch einen eigenen Speicherblock an das CMemFile
Objekt anfügen, indem Sie Attach aufrufen. In beiden Fällen wird der Speicher für die Erweiterung der Speicherdatei automatisch in Schritten der nGrowBytes
Größe zugewiesen, wenn nGrowBytes
nicht 0.
Der Speicherblock wird beim Löschen des CMemFile
Objekts automatisch gelöscht, wenn der Speicher ursprünglich vom CMemFile
Objekt zugewiesen wurde. Andernfalls sind Sie für die Zuordnung des speichers verantwortlich, den Sie an das Objekt angefügt haben.
Sie können über den angegebenen Zeiger auf den Speicherblock zugreifen, wenn Sie ihn vom CMemFile
Objekt trennen, indem Sie "Detach" aufrufen.
Die häufigste Verwendung CMemFile
besteht darin, ein CMemFile
Objekt zu erstellen und zu verwenden, indem CFile-Memberfunktionen aufgerufen werden. Das Erstellen eines CMemFile
automatisch geöffneten Vorgangs wird automatisch geöffnet: Sie rufen CFile::Open nicht auf, das nur für Datenträgerdateien verwendet wird. Da CMemFile
keine Datenträgerdatei verwendet wird, wird das Datenelement CFile::m_hFile
nicht verwendet.
Die CFile
Memberfunktionen "Duplicate", "LockRange" und "UnlockRange" werden nicht implementiert.CMemFile
Wenn Sie diese Funktionen für ein CMemFile
Objekt aufrufen, erhalten Sie eine CNotSupportedException.
CMemFile
verwendet die Laufzeitbibliotheksfunktionen malloc, realloc und kostenlos, um Speicher zuzuweisen, neu zuzuordnen und zu behandeln; und das systeminterne Memcpy, um den Kopierspeicher beim Lesen und Schreiben zu blockieren. Wenn Sie dieses Verhalten oder das Verhalten ändern möchten, wenn CMemFile
eine Datei wächst, leiten Sie Ihre eigene Klasse von den entsprechenden Funktionen ab CMemFile
und überschreiben Sie es.
Weitere Informationen CMemFile
finden Sie in den Artikeln "Files in MFC and Memory Management(MFC) " und unter "Dateiverarbeitung " in der Laufzeitbibliotheksreferenz.
Vererbungshierarchie
CMemFile
Anforderungen
Header: afx.h
CMemFile::Alloc
Diese Funktion wird von CMemFile
Memberfunktionen aufgerufen.
virtual BYTE* Alloc(SIZE_T nBytes);
Parameter
nBytes
Anzahl der Zuteilung von Arbeitsspeicherbytes.
Rückgabewert
Ein Zeiger auf den speicherblock, der zugewiesen wurde, oder NULL, wenn die Zuordnung fehlgeschlagen ist.
Hinweise
Überschreiben Sie diese Funktion, um die benutzerdefinierte Speicherzuweisung zu implementieren. Wenn Sie diese Funktion außer Kraft setzen, sollten Sie "Free" und "Realloc" wahrscheinlich auch außer Kraft setzen.
Die Standardimplementierung verwendet die Laufzeitbibliotheksfunktion malloc , um Arbeitsspeicher zuzuweisen.
CMemFile::Attach
Rufen Sie diese Funktion auf, um einen Speicherblock anzufügen CMemFile
.
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parameter
lpBuffer
Zeiger auf den Puffer, der angefügt CMemFile
werden soll.
nBufferSize
Eine ganze Zahl, die die Größe des Puffers in Bytes angibt.
nGrowBytes
Die Speicherzuordnung in Bytes erhöht.
Hinweise
Dies bewirkt CMemFile
, dass der Speicherblock als Speicherdatei verwendet wird.
Wenn nGrowBytes 0 ist, CMemFile
wird die Dateilänge auf nBufferSize festgelegt. Dies bedeutet, dass die Daten im Speicherblock, bevor sie angefügt CMemFile
wurden, als Datei verwendet werden. Auf diese Weise erstellte Speicherdateien können nicht vergrößert werden.
Da die Datei nicht vergrößert werden kann, achten Sie darauf, nicht zu versuchen CMemFile
, die Datei zu vergrößern. Rufen Sie beispielsweise nicht die CMemFile
Außerkraftsetzungen von "CFile:Write" auf, um über das Ende zu schreiben, oder rufen Sie CFile:SetLength nicht mit einer Länge auf, die länger als nBufferSize ist.
Wenn nGrowBytes größer als 0 ist, CMemFile
wird der Inhalt des angefügten Speicherblocks ignoriert. Sie müssen den Inhalt der Speicherdatei ganz neu schreiben, indem Sie die CMemFile
Außerkraftsetzung verwenden CFile::Write
. Wenn Sie versuchen, über das Ende der Datei zu schreiben oder die Datei zu vergrößern, indem Sie die CMemFile
Außerkraftsetzung CFile::SetLength
aufrufen, CMemFile
wird die Speicherzuweisung in Schritten von nGrowBytes vergrößert. Das Vergrößern der Speicherzuweisung schlägt fehl, wenn der von Ihnen übergebene Attach
Speicherblock nicht mit einer methode zugeordnet wurde, die mit Alloc kompatibel ist. Um mit der Standardimplementierung Alloc
kompatibel zu sein, müssen Sie den Speicher mit der Laufzeitbibliotheksfunktion malloc oder calloc zuweisen.
CMemFile::CMemFile
Die erste Überladung öffnet eine leere Speicherdatei.
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parameter
nGrowBytes
Die Speicherzuordnung in Bytes erhöht.
lpBuffer Pointer auf einen Puffer, der Informationen zur Größe nBufferSize empfängt.
nBufferSize
Eine ganze Zahl, die die Größe des Dateipuffers in Bytes angibt.
Hinweise
Die Datei wird vom Konstruktor geöffnet. Rufen Sie CFile::Open nicht auf.
Die zweite Überladung fungiert genauso wie bei Verwendung des ersten Konstruktors und sofort mit dem Aufruf "Anfügen " mit denselben Parametern. Einzelheiten dazu finden Sie unter Attach
.
Beispiel
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
Rufen Sie diese Funktion auf, um einen Zeiger auf den von .CMemFile
BYTE* Detach();
Rückgabewert
Ein Zeiger auf den Speicherblock, der den Inhalt der Speicherdatei enthält.
Hinweise
Durch Aufrufen dieser Funktion wird auch die CMemFile
. Sie können den Speicherblock CMemFile
erneut anfügen, indem Sie Attach aufrufen. Wenn Sie die Datei erneut anfügen und die Darin enthaltenen Daten verwenden möchten, sollten Sie CFile::GetLength aufrufen, um die Länge der Datei vor dem Aufrufen Detach
abzurufen. Wenn Sie einen Speicherblock CMemFile
anfügen, damit Sie dessen Daten ( nGrowBytes
== 0) verwenden können, können Sie die Speicherdatei nicht vergrößern.
CMemFile::Free
Diese Funktion wird von CMemFile
Memberfunktionen aufgerufen.
virtual void Free(BYTE* lpMem);
Parameter
lpMem
Zeiger auf den Speicher, der abgeglichen werden soll.
Hinweise
Überschreiben Sie diese Funktion, um benutzerdefinierte Speicher-Deallocation zu implementieren. Wenn Sie diese Funktion außer Kraft setzen, sollten Sie wahrscheinlich auch Alloc und Realloc außer Kraft setzen.
CMemFile::GetBufferPtr
Dient zum Abrufen oder Schreiben in den Speicherpuffer, der eine Speicherdatei zurückgibt.
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
Parameter
nCommand
Der pufferBefehl , der ausgeführt werden soll (bufferCheck
, bufferCommit
, , bufferRead
oder bufferWrite
).
nCount
Je nach nCommand wird die Anzahl der Bytes im Puffer zum Lesen, Schreiben oder Commit ausgeführt. Geben Sie beim Lesen aus dem Puffer -1 an, um einen Puffer von der aktuellen Position bis zum Ende der Datei zurückzugeben.
ppBufStart
[out] Der Anfang des Puffers. Muss sein NULL
, wenn nCommand ist bufferCommit
.
ppBufMax
[out] Das Ende des Puffers. Muss sein NULL
, wenn nCommand ist bufferCommit
.
Rückgabewert
Befehlswert | Rückgabewert |
---|---|
buffercheck |
Gibt bufferDirect zurück, wenn die direkte Pufferung unterstützt wird, andernfalls 0. |
bufferCommit |
Gibt 0 zurück. |
bufferRead oder bufferWrite |
Gibt die Anzahl der Bytes im zurückgegebenen Pufferbereich zurück. ppBufStart und ppBufMax zeigen auf den Anfang und das Ende des Lese-/Schreibpuffers. |
Hinweise
Die aktuelle Position im Speicherpuffer (m_nPosition
) wird je nach nCommand wie folgt erweitert:
nCommand | Pufferposition |
---|---|
bufferCommit |
Die aktuelle Position wechselt um die Größe des zugesicherten Puffers. |
bufferRead |
Die aktuelle Position wechselt um die Größe des Lesepuffers. |
CMemFile::GrowFile
Diese Funktion wird von mehreren Memberfunktionen CMemFile
aufgerufen.
virtual void GrowFile(SIZE_T dwNewLen);
Parameter
dwNewLen
Neue Größe der Speicherdatei.
Hinweise
Sie können sie außer Kraft setzen, wenn Sie ändern möchten, wie CMemFile
die Datei wächst. Die Standardimplementierung ruft Realloc auf, um einen vorhandenen Block (oder Alloc zum Erstellen eines Speicherblocks) zu vergrößern, um Arbeitsspeicher in Vielfachen des nGrowBytes
im Konstruktor oder Attach-Aufruf angegebenen Werts zu zuordnen.
CMemFile::Memcpy
Diese Funktion wird von den CMemFile
Außerkraftsetzungen von "CFile::Read " und "CFile::Write" aufgerufen, um Daten in und aus der Speicherdatei zu übertragen.
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
Parameter
lpMemTarget
Zeigen Sie auf den Speicherblock, in den der Quellspeicher kopiert wird.
lpMemSource
Zeigen Sie auf den Quellspeicherblock.
nBytes
Anzahl der zu kopierenden Bytes.
Rückgabewert
Eine Kopie von lpMemTarget.
Hinweise
Überschreiben Sie diese Funktion, wenn Sie die Art und Weise ändern möchten, CMemFile
wie diese Speicherkopien ausgeführt werden.
CMemFile::Realloc
Diese Funktion wird von CMemFile
Memberfunktionen aufgerufen.
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
Parameter
lpMem
Ein Zeiger auf den Speicherblock, der neu zugeordnet werden soll.
nBytes
Neue Größe für den Speicherblock.
Rückgabewert
Ein Zeiger auf den Speicherblock, der neu zugeordnet (und möglicherweise verschoben) wurde, oder NULL, wenn die Neuzuordnung fehlgeschlagen ist.
Hinweise
Überschreiben Sie diese Funktion, um eine benutzerdefinierte Speicherüberlastung zu implementieren. Wenn Sie diese Funktion außer Kraft setzen, sollten Sie wahrscheinlich auch Alloc und Free außer Kraft setzen.