Вы можете распределять память и управлять ею с помощью Visual FoxPro API.

NoteЗамечание

Описанные методы относятся как к элементам управления ActiveX так и FLL-библиотекам.

Чтобы распределять и использовать память

  1. Распределите дескриптор с помощью _AllocHand( ).

  2. Заблокируйте дескриптор с помощью _HLock( ).

  3. Преобразуйте дескриптор в указатель с помощью _HandToPtr( ).

  4. Сошлитесь на память, используя указатель.

  5. Разблокируйте дескриптор с помощью _HUnLock( ).

    NoteЗамечание

    Для того, чтобы избежать разрушения memo-файла, не делайте запись в memo-файл перед вызовом функции _AllocMemo( ).

Для того, чтобы обращаться к распределенной памяти, Ваши API-программы должны преобразовать дескриптор в указатель, вызывая для этого программу _HandToPtr( ). Даже если менеджеру памяти Visual FoxPro нужно будет реорганизовывать память для того, чтобы при последующих ее запросах получать больший участок непрерывной  памяти, дескриптор останется тем же. Программы, которые наращивают, уменьшают, освобождают и блокируют распределение памяти тоже имеются в Вашем распоряжении.

Когда Вы создаете внешние программы, пытайтесь минимизировать использование памяти. Если Вы создаете внешнюю программу, которая динамически распределяет память, пытайтесь использовать наименьший объемдоступной памяти. Быть особенно осторожными при блокировке больших объемов памяти на длительные периоды времени. Не забывайте разблокировать дескриптор памяти с помощью _HUnLock( ) когда блокировка  больше не нужна, поскольку от этого может снизится производительность Visual FoxPro.

Caution noteПредупреждение

Чрезмерное использование динамической памяти лишает Visual FoxPro памяти для буферов, окон, меню и т.д. и снижает его производительность, поскольку памятьдля выполнения API отдается из резервов самого Visual FoxPro. Распределяя много дескрипторов и удерживая их может привести к тому, что Visual FoxPro будет сам испытывать недостаток в памяти и завершится ненормально. Среда Visual FoxPro не имеет защиты памяти. Внешняя API- программа не может обеспечить все подтверждения достоверности, которые присущи стандартной программе Visual FoxPro. Если Вы повредите память, то получите такие сообщения как"Transgressed handle" ("Нарушение дескриптора"),  "Internal consistency error" ("Внутренняя ошибка из-за несовместимости") или "Transgressed node during compaction" ("Нарушение точки пересечения во время уплотнения":).

Следующее функции из библиотеки FLL иллюстрирует распределение памяти. Пример использует _RetDateStr( ), чтобы возвратить в Visual FoxPro тип Даты (допустим что Character-параметр является соответствующей датой):

 CopyCode imageКопировать код
#include <Pro_ext.h>

void dates(ParamBlk *parm)
{
MHANDLE mh;
char *instring;

if ((mh = _AllocHand(parm->p[0].val.ev_length + 1)) == 0) {
_Error(182); // "Не хватает памяти"
}
_HLock(parm->p[0].val.ev_handle);
instring = _HandToPtr(parm->p[0].val.ev_handle);
instring[parm->p[0].val.ev_length] = '\0';
_RetDateStr(instring);
_HUnLock(parm->p[0].val.ev_handle);
}
FoxInfo myFoxInfo[] = {
{"DATES", (FPFI) dates, 1, "C"}
};
FoxTable _FoxTable = {
(FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};

См. также