

Программирование на языке MFC
Мой второй блог в серии программирования
Присоединение блока памяти к объекту и отсоединение блока памяти от объекта
Но, думаю, у читателя уже возник вопрос – а как же быть в тех случаях, когда мы для создания файла в памяти используем конструктор по умолчанию? Для того чтобы можно было ассоциировать объект класса CMemFile с уже созданным буфером, можно воспользоваться методом Attach(). Его исходный код находится в файле filemem.cpp:
void CMemFile::Attach(BYTE* lpBuffer,
UINT nBufferSize, UINT nGrowBytes)
{
ASSERT(m_lpBuffer == NULL);
m_nGrowBytes = nGrowBytes;
m_nPosition = 0;
m_nBufferSize = nBufferSize;
m_nFileSize = nGrowBytes == 0 ? nBufferSize : 0; m_lpBuffer = lpBuffer; m_bAutoDelete = FALSE;
}
При вызове этого метода в качестве аргументов используются указатель на буфер в памяти, размер этого буфера и размер приращения, который по умолчанию равен нулю. Код метода полностью совпадает с кодом второго конструктора. Разница между ними в том, что при вызове конструктора создается объект класса, к которому принадлежу вызываемый конструктор. При вызове метода (не конструктора) объект не создается. Следовательно, в отличие от вызова конструктора, при вызове метода AttachQ ранее созданный буфер в памяти ассоциируется с объектом класса CMemFile.
Для того чтобы «отсоединить» буфер от объекта, используется метод Detach():
BYTE* CMemFile::Detach() {
BYTE* lpBuffer = m_lpBuffer; m_lpBuffer = NULL; m_nFileSize = 0; m_nBufferSize = 0; m_nPosition = 0; return lpBuffer;
}
Фактически метод обнуляет поля объекта, после чего возвращает указатель на «отсоединенный» от объекта буфер. Этот указатель в дальнейшем может быть использован другими фрагментами программы.
