Возвращает дескриптор MHANDLE нового блока памяти размером hsize.
MHANDLE _AllocHand(unsigned int hsize) unsigned int hsize; /* Размер нового блока памяти в байтах. */ |
Примечания
_AllocHand( ) возвращает 0, если для выполнения запроса памяти недостаточно. Память, выделяемая программой _AllocHand( ), не инициализируется и ее необходимо освобождать после использования.
Для получения дополнительной информации о том, как создавать библиотеку API и интегрировать её в Visual FoxPro, смотрите Доступ к API Visual FoxPro.
Пример
В следующем примере осуществляется размножение символа в памяти, предоставленной _AllocHand( ). API-функция REPLTOMH( ) возвращает в Visual FoxPro дескриптор блока памяти. Из Visual FoxPro этот дескриптор передается (как целое число, "I") API-функциям, в которых предусмотрен аргумент в виде дескриптора блока памяти.
Код Visual FoxPro
Copy Code | |
|---|---|
SET LIBRARY TO ALLOCHAN
mh = REPLTOMH("x", 120)
? MHTOFOX(mh)
? LEN(MHTOFOX(mh))
? MHTOFOX(mh)
= FREEMH(mh) | |
Код C
Copy Code | |
|---|---|
#include <pro_ext.h>
// Replicate char argument to memory allocated with _AllocHand().
// Return the memory handle to Visual FoxPro.
void FAR replToMH(ParamBlk FAR *parm)
{
char FAR *rep;
char c = *(char *) _HandToPtr(parm->p[0].val.ev_handle);
MHANDLE mh;
if ((mh = _AllocHand((int) parm->p[1].val.ev_long + 1)) == 0)
{
_Error(182); // "Insufficient memory"
}
_HLock(mh);
rep = _HandToPtr(mh);
_MemFill(rep, c, (int) parm->p[1].val.ev_long);
rep[parm->p[1].val.ev_long] = '\0'; // null terminate
_HUnLock(mh);
_RetInt(mh, 10);
}
// Returns characters in memory handle.
// Argument in call from Visual FoxPro
// must be a valid Visual FoxPro memory handle.
void FAR MHToFoxString(ParamBlk FAR *parm)
{
char FAR *string;
MHANDLE mh = parm->p[0].val.ev_long;
_HLock(mh);
string = _HandToPtr(mh);
_RetChar(string);
_HUnLock(mh);
}
// Frees memory handle. Argument in call from
// Visual FoxPro must be a valid
// Visual FoxPro memory handle.
void FAR freeMH(ParamBlk FAR *parm)
{
_FreeHand((MHANDLE) parm->p[0].val.ev_long);
}
FoxInfo myFoxInfo[] = {
{"REPLTOMH", (FPFI) replToMH, 2, "C,I"},
{"MHTOFOX", (FPFI) MHToFoxString, 1, "I"},
{"FREEMH", (FPFI) freeMH, 1, "I"},
};
FoxTable _FoxTable = {
(FoxTable FAR *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
}; | |
Смотрите также
Справочное руководство
Процедура библиотеки API _FreeHand( )Процедура библиотеки API _GetHandSize( )
Процедура библиотеки API _HandToPtr( )
Процедура библиотеки API _HLock( )
Процедура библиотеки API _HUnLock( )
Процедура библиотеки API _MemAvail( )
Процедура библиотеки API _SetHandSize( )
Концепции
Процедуры библиотеки API от A до ZПрочие ресурсы
Процедуры библиотеки API по категориям
c Microsoft Corporation. All rights reserved. Microsoft is not reponsible for the contents of the translated help topics.