Share via


_AllocHand( ) (Rutina de biblioteca API)

Devuelve un nuevo MHANDLE de tamaño hsize.

MHANDLE _AllocHand(unsigned int hsize)
unsigned int hsize;            /* Size of new memory handle in bytes. */

Observaciones

_AllocHand( ) devuelve 0 cuando no hay memoria suficiente para cumplir la petición. La memoria asignada con _AllocHand( ) no se inicializa y se debe liberar tras su uso.

Para obtener más información acerca de cómo crear una biblioteca API e integrarla con Visual FoxPro, vea Acceso a la API de Visual FoxPro.

Ejemplo

En el siguiente ejemplo, un carácter se duplica en memoria aportada por _AllocHand( ). La función API REPLTOMH( ) devuelve el controlador de memoria a Visual FoxPro. Desde Visual FoxPro, el controlador de memoria se pasa a las funciones API, que esperan un argumento de controlador de memoria (que se pasa como un entero, "I").

Código Visual FoxPro

SET LIBRARY TO ALLOCHAN
mh = REPLTOMH("x", 120)
? MHTOFOX(mh)
? LEN(MHTOFOX(mh))
? MHTOFOX(mh)
= FREEMH(mh)

Código C

#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
};

Vea también

_FreeHand( ) (Rutina de biblioteca API) | _GetHandSize( ) (Rutina de biblioteca API) | _HandToPtr( ) (Rutina de biblioteca API) | _HLock( ) | _HUnLock( ) (Rutina de biblioteca API) | _MemAvail( ) (Rutina de biblioteca API) | _SetHandSize( ) (Rutina de biblioteca API)