[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