Share via


_MemMove( ) (Rutina de biblioteca API)

Copia length bytes de src a dest.

void _MemMove(void FAR *dest, void FAR *src, unsigned int length)
void FAR *dest;            /* Destination. */
void FAR *src;               /* Starting position. */
unsigned int length;         /* How many bytes to move. */

Observaciones

Los movimientos superpuestos se llevan a cabo en el sentido adecuado para evitar que se degraden los datos.

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

El ejemplo siguiente utiliza _MemMove( ) para implementar una función de subcadena. Desde Visual FoxPro, MEMMOVE(s, n1, n2) devuelve la subcadena de s; comienza en la posición n1 y termina en la posición n2.

Código Visual FoxPro

SET LIBRARY TO MEMMOVE 
? MEMMOVE("Hello, world.", 8, 10)  && returns "wor"

Código C

#include <pro_ext.h>

FAR Example(ParamBlk FAR *parm)
{
   int SubstrLen;
   MHANDLE bufferHandle;
   char FAR *FirstDest;

   SubstrLen = parm->p[2].val.ev_long - parm->p[1].val.ev_long + 1;
   if ((bufferHandle = _AllocHand(SubstrLen + 1)) == 0)
   {
      _Error(182); // "Insufficient memory"
   }
   _HLock(bufferHandle);
   _HLock(parm->p[0].val.ev_handle);
   FirstDest = (char FAR *) _HandToPtr(parm->p[0].val.ev_handle) +
      parm->p[1].val.ev_long - 1;

   _MemMove(_HandToPtr(bufferHandle), FirstDest, SubstrLen);

   ((char FAR *) _HandToPtr(bufferHandle))[SubstrLen] = '\0';
   _RetChar(_HandToPtr(bufferHandle));
   _HUnLock(bufferHandle);
   _HUnLock(parm->p[0].val.ev_handle);
}
FoxInfo myFoxInfo[] = {
   {"MEMMOVE", (FPFI) Example, 3, "C,I,I"},
};
FoxTable _FoxTable = {
   (FoxTable FAR *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};

Vea también

_MemCmp( ) (Rutina de biblioteca API) | _MemFill( ) (Rutina de biblioteca API) | Acceso a la API de Visual FoxPro