Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Integración C en Delphi (https://www.clubdelphi.com/foros/showthread.php?t=40846)

senda 28-02-2007 14:12:04

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.

Neftali [Germán.Estévez] 28-02-2007 14:23:52

Podrías utilizar DLL's ¿Te serviría eso?

senda 01-03-2007 11:48:34

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???

Neftali [Germán.Estévez] 01-03-2007 13:09:22

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.

basti 01-03-2007 15:05:13

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.

seoane 01-03-2007 16:55:47

1 Archivos Adjunto(s)
Es la primera vez que pruebo a hacer una dll en C. Espero que este bien :o

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';

Neftali [Germán.Estévez] 01-03-2007 17:34:16

Y funciona perfectamete, como era de esperar...:D:D:D

roman 01-03-2007 18:31:24

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

senda 07-03-2007 13:47:50

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?

seoane 07-03-2007 13:55:19

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

senda 07-03-2007 14:00:45

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?

seoane 07-03-2007 14:04:32

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.

senda 07-03-2007 14:05:25

Ok, perfecto (ya me funciona). Muchas gracias. Lo había entendido mal.


La franja horaria es GMT +2. Ahora son las 09:39:49.

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