Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2014-06

Implementar PascalMock

7 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

francisco prieto

Chicos,

Estoy trabado con este error.

[image: Im�genes integradas 1]

Alguien me puede dar una mano... el paquete se baja desde aca...

http://sourceforge.net/projects/pascalmock/

Desde ya muchas gracias.

Pancho
Cordoba
Argentina
------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140620/fe8d4032/attachment-0001.html> ------------ pr�xima parte ------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 9806 bytes
Desc: no disponible
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140620/fe8d4032/attachment-0001.png>

Reply by email

francisco prieto

Chicos,

Cuando quiero implementar PascalMock me da el siguiente error:

NoRefCountObject.pas(18,24) Error: No matching implementation for interface
method "IUnknown.QueryInterface(constref TGuid,out <Formal type>):LongInt;
StdCall;" found

Revisando en foros este mismo error dicen que la defincion es distinta a la implementacion y es por eso que da el error, sin embargo, el c�digo que pertenece al paquete esta escrito as�.

type
  // TNoRefCountObject
  //
  {: Base object to implement interfaces without reference counting }
  TNoRefCountObject =  class(TObject, IInterface)
  protected
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;
implementation

{ TNoRefCountObject }

function TNoRefCountObject.QueryInterface(const IID: TGUID;
  out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

Y donde se�ale se el compilador se detiene con error...

Me pueden dar una mano.

Gracias,

Pancho
Cordoba
Argentina
------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140620/25c7d055/attachment.html>

Reply by email

José Mejuto
to francisco prieto

El 20/06/2014 20:33, francisco prieto escribi�:

TNoRefCountObject = class(TObject, IInterface) protected function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
        function QueryInterface(constREF IID: TGUID; out Obj): HResult;
stdcall;
function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end;

Esa es una diferencia con Delphi, al ser Delphi "Windows Only".

Reply by email

francisco prieto
to José Mejuto

No se si estoy mejor o peor Jose porque ahora le puse:

type
  // TNoRefCountObject
  //
  {: Base object to implement interfaces without reference counting }
  TNoRefCountObject =  class(TObject, IInterface)
  protected
    function QueryInterface(const*ref* IID: TGUID; out Obj): HResult;
stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;
implementation

{ TNoRefCountObject }

function TNoRefCountObject.QueryInterface(const*ref* IID: TGUID; out Obj):
HResult;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

y me da esta sarta de errores:

NoRefCountObject.pas(29,28) Error: Calling convention doesn't match forward
NoRefCountObject.pas(20,14) Hint: Found declaration:
TNoRefCountObject.QueryInterface(constref TGuid,out <Formal type>):LongInt;
StdCall;
NoRefCountObject.pas(37,28) Error: Calling convention doesn't match forward
NoRefCountObject.pas(21,14) Hint: Found declaration:
TNoRefCountObject._AddRef:LongInt; StdCall;
NoRefCountObject.pas(42,28) Error: Calling convention doesn't match forward
NoRefCountObject.pas(22,14) Hint: Found declaration:
TNoRefCountObject._Release:LongInt; StdCall;
NoRefCountObject.pas(48) Fatal: There were 3 errors compiling module,
stopping

Gracias por la mano,

Pancho
C�rdoba
Argentina

2014-06-20 15:55 GMT-03:00 Jos� Mejuto <joshyfun en gmail.com>:

Show quoted text 25 lines
El 20/06/2014 20:33, francisco prieto escribi�: TNoRefCountObject = class(TObject, IInterface) > protected > function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; > function QueryInterface(constREF IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; > function _Release: Integer; stdcall; > end; > > Esa es una diferencia con Delphi, al ser Delphi "Windows Only". -- _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140620/65ab91cd/attachment.html>

Reply by email

francisco prieto
to francisco prieto

"Tanto va el c�ntaro a la fuente hasta que se rompe",dicen...

Pues bien

Busque expresamente el error "Calling convention doesn't match forward" y lo encontr� ac�...

http://www.freepascal.org/docs-html/user/userse62.html

Entend� que lo que estaba faltando era *stdcall;*

Le agregue eso en la implementaci�n y compil�... Ahora da otros errores pero ya tienen que ver con el TDD que estoy realizando, as� que sigo adelante...

Ya me explicar�n bien porque hay que utilizar constref y no const como estaba en el paquete.

Agradezco la buena predisposici�n de sus respuestas.

Saludos y sigo adelante,

Pancho
C�rdoba
Argentina

2014-06-20 16:04 GMT-03:00 francisco prieto <fajprieto en gmail.com>:

Show quoted text 80 lines
No se si estoy mejor o peor Jose porque ahora le puse: type // TNoRefCountObject // {: Base object to implement interfaces without reference counting } TNoRefCountObject = class(TObject, IInterface) protected function QueryInterface(const*ref* IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; implementation { TNoRefCountObject } function TNoRefCountObject.QueryInterface(const*ref* IID: TGUID; out Obj): HResult; begin if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE; end; y me da esta sarta de errores: NoRefCountObject.pas(29,28) Error: Calling convention doesn't match forward NoRefCountObject.pas(20,14) Hint: Found declaration: TNoRefCountObject.QueryInterface(constref TGuid,out <Formal type>):LongInt; StdCall; NoRefCountObject.pas(37,28) Error: Calling convention doesn't match forward NoRefCountObject.pas(21,14) Hint: Found declaration: TNoRefCountObject._AddRef:LongInt; StdCall; NoRefCountObject.pas(42,28) Error: Calling convention doesn't match forward NoRefCountObject.pas(22,14) Hint: Found declaration: TNoRefCountObject._Release:LongInt; StdCall; NoRefCountObject.pas(48) Fatal: There were 3 errors compiling module, stopping Gracias por la mano, Pancho C�rdoba Argentina 2014-06-20 15:55 GMT-03:00 Jos� Mejuto <joshyfun en gmail.com>: El 20/06/2014 20:33, francisco prieto escribi�: > > > TNoRefCountObject = class(TObject, IInterface) >> protected >> function QueryInterface(const IID: TGUID; out Obj): HResult; >> stdcall; >> > function QueryInterface(constREF IID: TGUID; out Obj): HResult; > stdcall; > > function _AddRef: Integer; stdcall; >> function _Release: Integer; stdcall; >> end; >> >> > Esa es una diferencia con Delphi, al ser Delphi "Windows Only". > > -- > > > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es >

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140620/e2b9f540/attachment-0001.html>

Reply by email

José Mejuto
to francisco prieto

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.

Reply by email

francisco prieto
to José Mejuto

Much�mas gracias por la explicacion.

Saludos,

Pancho
C�rdoba
Argentina

El 21 de junio de 2014, 8:58, Jos� Mejuto <joshyfun en gmail.com> escribi�:

Show quoted text 39 lines
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. -- _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140621/5d6bf69f/attachment.html>

Reply by email