[Lazarus-es] Implementar PascalMock

José Mejuto joshyfun en gmail.com
Sab Jun 21 13:58:44 CEST 2014


El 20/06/2014 21:28, francisco prieto escribió:

> Ya me explicarán bien porque hay que utilizar constref y noconst como
> estaba en el paquete.
>

Hola,

Me alegro que lo solucionaras. La diferencia entre ambos modos es por 
culpa de las "Calling Convention" o cómo se pasan parámetros a funciones 
en las distintas plataformas (Windows, Mac, Unix, ....). En Windows un 
TGUID (bloque de memoria de 16 bytes) con el modificador "const" se pasa 
como un puntero a ese bloque de memoria, mientras que en Unix se hace 
una copia de esos 16 bytes y luego se pasa un puntero a la copia.

Por este motivo fpc tuvo que "inventarse" un nuevo modificador, el 
"constref" que en todas las plataformas se pasa como un puntero al 
bloque de memoria sin realizar nunca una copia.

Lo que teníamos que poner antes era algo como:

function QueryInterface({$IFDEF WINDOWS} const {$ELSE} var {$ENDIF} IID: 
TGUID; out Obj): HResult; stdcall;

Para poder trabajar con paquetes estilo ActiveX en Linux (no son ActiveX 
pero si el estilo).

Muchas veces la diferencia entre const y constref es nula y ambos se 
comportan del mismo modo, pero otras veces no, y ahí está la diferencia.

-- 





More information about the Lazarus-es mailing list