Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   stdcall? overload? (https://www.clubdelphi.com/foros/showthread.php?t=36981)

hmv 30-10-2006 17:09:53

stdcall? overload?
 
Hola estoy intentando hacer una dll en delphi pero lei por alli q usan estas 2 palabras(stdcall; overload;) al final de la funcion. Ademas que conflictos puede haber si declaro la variable C como string y pq char o pchar

Código Delphi [-]
function Triple (C: Char): Integer; stdcall; overload;
begin
//  ShowMessage ('Triple (Char) function called');
  MessageBox (0, 'Triple function called',
    'First DLL', mb_OK);
  Result := Ord (C) * 3;
end


Gracias

delphi.com.ar 30-10-2006 17:31:47

¿Y cuál es la pregunta? :D

Cuando el código compilado en Delphi, llama una función o procedimiento, en ese instante se va agregando a la pila de ese hilo de ejecución: El puntero de la siguiente instrucción después de la llamada a la función y el puntero a cada uno de los parámetros de izquierda a derecha exceptuando los tres primeros parámetros, que por optimización se guardan en registros, y la función es la encargada de quitarlos de la pila al retornar. Pero si necesitamos llamar a una función que no respete esquema, tenemos cinco convenios estándares de llamadas:

register Convención por defecto de Delphi descrita anteriormente.
pascal Original de los primeros compiladores, utiliza parámetros de izquierda a derecha y la rutina es la encargada de quitarlos.
cdecl Parámetros de derecha a izquierda y es quien llama que tiene que quitar los parámetros de la pila. (Tipo ANSI C)
stdcall Es el standard de windows, los parámetros se agregan de Izquierda a Derecha y la rutina los quita.
safecall Los parámetros se agregan de Izquierda a Derecha y la rutina los quita.

Saludos!

delphi.com.ar 30-10-2006 17:35:04

Me olvidaba: La directiva overload le indica al compilador que ese procedimiento puede ser sobrecargado, en pocas palabras: puede haber dos procedimientos homónimos con distinto juego de parámetros y es el compilador el que decide cual llamar según los parámetros que se especifiquen en la llamada.

Saludos!

hmv 30-10-2006 20:06:06

Hola, gracias por responder.

-Una cosa, y como debe saber cual de estos standares usar???
-A que te refieres con parametros de derecha izq, disculpa mi ignorancia, recien estoy aprendiendo delphi.
-Y cuales son los conflictos entre los tipos de datos, Ej. y hago una DLL en VisualBasic, funcionara en delphi??

Gracias nuevamente.

delphi.com.ar 30-10-2006 21:14:28

Cita:

Empezado por hmv
-Una cosa, y como debe saber cual de estos standares usar???

En cada caso puede ser distinto, por eso es importante la documentación. Aunque Windows estableció como estandard: stdcall

Cita:

Empezado por hmv
-A que te refieres con parametros de derecha izq, disculpa mi ignorancia, recien estoy aprendiendo delphi.

Si yo tengo la función:
Código Delphi [-]
  CreateWindow(lpClassName: PChar; lpWindowName: PChar;
  dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
  hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; register;
Hará lo siguiente (esta algo simplificado para que se entienda):
Código Delphi [-]
asm
  push X                  { Agrega Primero el cuarto parámetro (X) a la pila}
  push Y                  { Luego el parámetro de su derecha }
  push nWidth             { ... }
  push nHeight
  push hWndParent
  push hMnu
  push hInstance
  push lpParam            { Por último lpParam }
  mov ecx, [dwStyle]
  mov edx, [lpWindowName] { Y los tres primeros parámetros en registros }
  mov eax, [lpClassName]
end;
en cambio, si laamamos a la función:
Código Delphi [-]
function CreateDialogParam(hInstance: HINST; lpTemplateName: PChar;
  hWndParent: HWND; lpDialogFunc: TFNDlgProc; dwInitParam: LPARAM): HWND; stdcall;
Que tiene la directiva stdcall, la ejecución será (otra vez simplificando):
Código Delphi [-]
asm
  push [dwInitParam]        { Primero el primer parámetro de la derecha }
  push [lpDialogFunc]       { Luego el de su izquierda }
  push [hWndParent]         { Luego el de su izquierda }
  push [lpTemplateName]     { ... }
  push [hInstance]          { ... }
end;

Cita:

Empezado por hmv
-Y cuales son los conflictos entre los tipos de datos, Ej. y hago una DLL en VisualBasic, funcionara en delphi??

Simplemente los tipos de datos de la llamada tienen que coincidir con los tipos de datos esperados por las funciones.
Por ejemplo si le quieres pasar un entero a VB6, tienes que tener en cuenta que los enteros en VB6 son de 16 bits, por lo tanto el equivalente a un Smallint de Delphi.

Saludos!


La franja horaria es GMT +2. Ahora son las 11:40:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi