Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-10-2006
hmv hmv is offline
Miembro
 
Registrado: oct 2006
Posts: 12
Poder: 0
hmv Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 30-10-2006
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
¿Y cuál es la pregunta?

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

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 30-10-2006 a las 17:35:25.
Responder Con Cita
  #3  
Antiguo 30-10-2006
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 30-10-2006
hmv hmv is offline
Miembro
 
Registrado: oct 2006
Posts: 12
Poder: 0
hmv Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 30-10-2006
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
problema con overload santiago14 Varios 1 03-03-2005 14:35:00
Error "there is no overload version" torito Varios 4 21-11-2003 20:54:00
Aclaracion de overload tica Varios 3 06-11-2003 16:09:59


La franja horaria es GMT +2. Ahora son las 03:30:31.


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
Copyright 1996-2007 Club Delphi