Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-02-2007
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Integración C en Delphi

Hola alguien tiene idea de si esto se puede hacer y como?? Es decir, ¿desde una aplicación Delphi se pueden utilizar funcionalidades implementadas en C? Muchas gracias.
Responder Con Cita
  #2  
Antiguo 28-02-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Podrías utilizar DLL's ¿Te serviría eso?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 01-03-2007
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Pues tendría que investigarlo. Te refieres a meter las funcionalidades implementadas en C en una libreria DLL y cargar dicha librería desde mi aplicación Delphi???
Suena interesante, pero tendré que documentarme bastante a cerca de la creación de DLL's y de la posterior integración de una DLL en una aplicación Delphi. Alguna sugerencia???
Responder Con Cita
  #4  
Antiguo 01-03-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
No lo he hecho nunca (que conste), pero en teoría no debe tener problemas.
Aquí hay expertos en C, a ver si nos dan su opinión.
¡O mejor! a ver si alguno nos crea una DLL con una funcioncilla sencilla (sumar(a,b:Integer), por ejemplo) e intentamos llamarla desde Delphi.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 01-03-2007
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 20
basti Va por buen camino
Un ejemplo suma:

La función en la dll escrita en C:

Código:
extern "C" __declspec(dllexport)
int WINAPI Suma (int a, int b)
{
	return a + b;
}
El extern "C", es para que se exporte la función con el mismo nombre (en este caso Suma).

Ahora el código Delphi:

Código Delphi [-]

function Suma(a, b : integer) : integer; stdcall; external 'dlldondeestasuma.dll'  name 'Suma'; 
// name es opcional, sólo haría falta si el nombre en delphi y en C fuesen distintos. 
// stdcall indica que la llamada no se hace en el formato Delphi, sino en el formato C (el usado por la mayoría de los lenguajes)



// llamada a la función
var
  n : integer;

begin
  n := Suma(3, 2);
end.

Esto vale para variables enteras, float o similares. Pero no para cadenas, ya que hay que mandarlas como Pchar, que es el formato que usa C. Los arrays o estructuras de datos se pueden enviar como punteros.
Responder Con Cita
  #6  
Antiguo 01-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Es la primera vez que pruebo a hacer una dll en C. Espero que este bien

El código de la primera dll (suma.c) es el siguiente:
Código:
__declspec(dllexport) int __stdcall Suma(int a, int b)
{
 return a+b;
}
La compilacion la hice con MinGW de esta manera (quitar los espacion ente los ++):
Código:
g + + -c suma.c
dllwrap --def suma.def suma.c -o suma.dll
Donde "suma.def" es:
Código:
LIBRARY    suma.dll
EXPORTS
    Suma = Suma@8                      @1
Para utilizar el código desde Delphi la importo así:
Código Delphi [-]
function Suma(a,b: integer): integer; stdcall; external 'suma.dll' name 'Suma';
Archivos Adjuntos
Tipo de Archivo: zip suma.zip (3,9 KB, 20 visitas)
Responder Con Cita
  #7  
Antiguo 01-03-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Y funciona perfectamete, como era de esperar...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 01-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Creo recordar que con Delphi se podían enlazar directamente al ejecutable archivos obj de C. Vendría siendo muy similar al uso de la dll pero todo en el mismo ejecutable.

Aquí hay una referencia para delphi 5. Sin embargo parece que si tales obj utlizan otras dlls la cuestión se complica, o al menos eso parece, por lo que dice Rudy Velthuis acá.

En fin, sólo quería comentarlo por si fuera una opción.

// Saludos
Responder Con Cita
  #9  
Antiguo 07-03-2007
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Siento no haber podido responder antes. Muchas gracias por las sugerencias, aunque tengo problemas con ellas. Apoyandome en las explicaciones de seoane y basti he conseguido crear suma.dll, pero (gracias a mi inexperiencia con Delphi) no soy capaz de llamarla desde un pequeño programita. Os adjunto el .pas
Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}



function Suma2(a, b : integer) : integer; stdcall; external 'suma.dll'  name 'Suma';
// name es opcional, sólo haría falta si el nombre en delphi y en C fuesen distintos.
// stdcall indica que la llamada no se hace en el formato Delphi, sino en el formato C (el usado por la mayoría de los lenguajes)  private

// llamada a la función
var
  n : integer;

begin
  n := Suma(3, 2);
  Suma2:=n;
end;


procedure TForm2.Button1Click(Sender: TObject);
begin
     Button1.Caption:=IntToStr(Suma2(5,6));
end.

end.
El compilador me dice que Suma no está declarado, por lo que asumo que no está cogiendo la dll, ¿me equivoco?
Responder Con Cita
  #10  
Antiguo 07-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por senda
El compilador me dice que Suma no está declarado
Porque no lo esta. Tu estas declarando Suma2 no Suma
Código Delphi [-]
function Suma2(a, b : integer) : integer; stdcall; external 'suma.dll'  name 'Suma';

Por cierto, no entiendo para que usas esto:
Código Delphi [-]
// llamada a la función
var
  n : integer;

begin
  n := Suma(3, 2);
  Suma2:=n;
end;
Basti te lo ponía como un ejemplo, pero no hace falta que lo incluyas en tu programa
Responder Con Cita
  #11  
Antiguo 07-03-2007
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Cita:
Empezado por seoane
Porque no lo esta. Tu estas declarando Suma2 no Suma

Por cierto, no entiendo para que usas esto:
Código Delphi [-]
// llamada a la función
var
  n : integer;

begin
  n := Suma(3, 2);
  Suma2:=n;
end;

Basti te lo ponía como un ejemplo, pero no hace falta que lo incluyas en tu programa
Vale entonces, creo que no lo he entendido. En la línea
Código Delphi [-]
  n := Suma(3, 2);
yo pensaba que se estaba llamando a la funcion implementada en C, pero por lo que veo, con la declaración
Código Delphi [-]
function Suma2(a, b : integer) : integer; stdcall; external 'suma.dll'  name 'Suma';
se supone que ya queda implícito, es decir, la función Suma2 ¿no necesita implementación? puesto que está implementada en suma.dll, ¿no?
Responder Con Cita
  #12  
Antiguo 07-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Exactamente , al declararla le estamos diciendo al compilador como es, donde esta, y con que nombre queremos llamarla, pero nada mas, la implementación ya esta dentro de la dll.
Responder Con Cita
  #13  
Antiguo 07-03-2007
senda senda is offline
Miembro
 
Registrado: sep 2006
Posts: 48
Poder: 0
senda Va por buen camino
Ok, perfecto (ya me funciona). Muchas gracias. Lo había entendido mal.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Integración de php y delphi Will PHP 4 11-08-2006 00:13:48
Integración Google earth Luci Internet 5 21-11-2005 16:14:35
Integración de datos kalimero Firebird e Interbase 3 17-02-2005 23:03:38
Integracion de una Aplicacion de Flash 5.0, a una forma en Delphi 6... delphi_gama Gráficos 2 22-08-2003 01:41:17
integracion de Hardware y sofware beatrizmh Conexión con bases de datos 1 17-08-2003 10:25:28


La franja horaria es GMT +2. Ahora son las 13:52:16.


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