Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Sustituir acceso DLL por unit en código C (https://www.clubdelphi.com/foros/showthread.php?t=79663)

jocaro 27-07-2012 08:59:20

Sustituir acceso DLL por unit en código C
 
Hola

En mi aplicación Delphi, estoy utilizando la base de datos sqlite v.3, a la que se accede a través de una DLL (sqlite3.dll).

Me gustaría acceder a través de su código fuente en C (sqlite3.c).

He estado buscando información de como hacerlo pero no consigo tenerlo claro. Agradecería que alguien pudiera ayudarme, en concreto en lo siguiente:
  • Como incluir en el proyecto la unit de código C y compilarlo
  • Ejemplo de acceso a una función de dicho código, desde Delphi
  • Como decir a un componente de acceso a base de datos de Delphi que debe utilizar esa unit en vez de la dll
Gracias y un saludo

Casimiro Noteví 27-07-2012 09:38:42

Lo que pides son "palabras mayores", tendrás que investigar el código de ese programa y cuando lo resuelvas, si te parece bien, explicas aquí cómo lo has hecho :)

roman 27-07-2012 16:21:42

No sé si venga mucho al caso, pero recuerdo que algo parecido hace midas. Normalmente tienes que incluir la biblioteca midas.dll pero si incluyes la unidas midaslib en el proyecto entonces no hace falta distribuir la biblioteca.

// Saludos

Ñuño Martínez 27-07-2012 21:07:08

Usar módulos C en Delphi no es difícil, sin embargo lo que tú quieres hacer sí lo es. El problema lo veo aquí:
Cita:

Empezado por jocaro (Mensaje 438307)
  • Como decir a un componente de acceso a base de datos de Delphi que debe utilizar esa unit en vez de la dll

Que yo sepa, la única forma de hacerlo es crear tu propio controlador o extender alguna clase de la familia TDataSet o TDataTable o alguna otra. No veo otra forma.

Yo he intentado extender esas clases para diseñar mi propio sistema de base de datos y no lo he conseguido.

roman 27-07-2012 21:12:52

Pero aún extendiendo la clase TDataSet, ¿cómo le harías?

Otro caso curioso es el de los componentes MyDac de DevArt. El componente TMyConnection tiene una propiedad Options.Direct. Si la pones en false, el ejecutable final requiere que la biblioteca libmysql.dll esté presente. Basta poner la opción en true para que el ejecutable sea independiente.

// Saludos

Ñuño Martínez 28-07-2012 01:35:26

Cita:

Empezado por roman (Mensaje 438368)
Pero aún extendiendo la clase TDataSet, ¿cómo le harías?

Como digo arriba, lo intenté pero no lo conseguí. No encontré información suficiente.

jocaro 28-07-2012 18:20:42

Hola.

Roman, Nuño, ante todo, muchas, muchisimas gracias por vuestra ayuda.

Me confirmáis mi sospecha de que lo mas problemático es decirle al componente que trabaje con el código, salvo que en dicho componente ya esté prevista una propiedad para ese fin.

De todos modos os rogaría un ejemplo de los dos primeros pasos; insertar y compilar la unidad de código C en el entorno Delphi y un ejemplo genérico de acceso a una función del código C desde un método en Delphi.

A ver si con esa información reduzco el problema para dedicarme sólo a revisar los componentes que uso (UniDac que, como MyDac, es de Devart) y revisar sus propiedades para ver si en alguna puedo "convencer" al componente de que se olvide de la DLL.

Un saludo y de nuevo gracias.

escafandra 29-07-2012 01:03:18

No se si las últimas versioned lo hacen, creo que no, pero las que yo conozco no compilan C. Así que lo tendrás que traducir a delphi.

Nunca entendí porqué a Builder C++ se le otorgó la capacidad de compilar archivos.pas y delphi no compila cpp...


Saludos.

Ñuño Martínez 29-07-2012 02:17:14

Cita:

Empezado por jocaro (Mensaje 438398)
De todos modos os rogaría un ejemplo de los dos primeros pasos; insertar y compilar la unidad de código C en el entorno Delphi y un ejemplo genérico de acceso a una función del código C desde un método en Delphi.

Lo intentaré, pero aviso que lo hago de memoria y sin probarlo, ¿eh? Posiblemente necesite algún ajuste.

Primero, el código C podría ser algo así:
Código:

/* Ejemplo para llamar desde Delphi. */
  int calcula_cuadrado (int numero)
  {
    return numero * numero;
  }

Ahora, la unidad "envolvente":
Código Delphi [-]
UNIT UnidadEnvolventeC

(* La línea siguiente no recuerdo si era así o usando $obj ó $l ... *)
{$link 'ejemplo.obj'}

INTERFACE
(* Función C. *)
  FUNCTION calcula_cuadrado (Numero: INTEGER): INTEGER; CDECL;
  EXTERNAL;

IMPLEMENTATION
END.

Y ahora el uso:
Código Delphi [-]
PROGRAM Ejemplo
{$mode console} (* ¿Era así? Es que en Free Pascal no hace falta XP *)

USES
  UnidadEnvolventeC;

VAR
  V1, V2: INTEGER;
BEGIN
  V1 := 20;
  V2 := calcula_cuadrado (V1);
END.

Ten cuidado con los tipos de dato de los parámetros y los valores que devuelve. Por ahí hay tablas que muestran la correspondencia entre los diferentes tipos, pero no te guíes por las apariencias porque a veces el tipo "int" de C no se corresponde con el tipo "INTEGER" de Pascal sino con "SMALLINT" ó con "LONGINT".

También ten en cuenta que el mapa de memoria no es idéntico en C y en Delphi, de ahí que se use "CDECL" en el código Pascal. La mayor parte de compiladores de C tienen una directiva que permite hacer lo opuesto (es decir, que la parte escrita en C use un mapa de memoria similar al de Pascal), pero no suele usarse mucho.

Y otra cosa: no uses C++, aparte de porque es un lenguaje horrible con todo lo malo de C y poco bueno añadido, porque el mapa de memoria de C++ es tan diferente del de Delphi que es casi imposible compartir datos. Hazlo todo en C.

jocaro 29-07-2012 20:26:06

Hola

Gracias por la ayuda y las recomendaciones.

Voy a verlas con detenimiento e intentar aplicarlas en mi programa

Un saludo


La franja horaria es GMT +2. Ahora son las 06:34:02.

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