Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-06-2022
TOLO68 TOLO68 is offline
Miembro
 
Registrado: sep 2016
Posts: 14
Poder: 0
TOLO68 Va por buen camino
Como llamar a una DLL de Windows u otras externas

Hola a todo el foro.
Hacia varios años que no escribia por aqui.

He creado una Dll, ADD.DLL , que suma o resta 2 numeros, es muy sencilla porque la uso de pruebas, para ver la compatibilidad con varios lenguajes.

Me va bien en Visual Basic 6, VB.Net 2010 y SharpDevelop , incluso sin registrar la Dll en el sistema, y teniendolas en la misma carpeta que el EXE

en estos lenguajes las declaro asi......

Private Declare Function SumaNumeros Lib "add.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
Private Declare Function RestaNumeros Lib "add.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Ahora quiero probarlas en Delphi, tengo la version 7, o si puede ser, en Lazarus de FreePascal, ya que quiero probar si son compatibles con otros lenguajes que no sean Basic.

Ojo, no se programar en Delphi, pero tampoco me suena todo a chino, je je

Antes de escribir en el foro, he buscado por Google, me sale la funcion DLLIMPORT , pero solo suele haber ejemplos para DLLs propias de windows, y los ejemplos

Y tambien, he leido algo de STDCALL y CDECL , que no tengo muy claro lo que es.

Muchas gracias a todos por adelantado.

Saludos desde España!!!
Responder Con Cita
  #2  
Antiguo 20-06-2022
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.282
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
Post

Por lo que se, que no es mucho, te comento a ver si te da alguna pista o algún hilo a partir del cual tirar...

Diría que las DLLs que implementes en Visual o en C# las puedes usar desde delphi utilizando COM. Deberás registrarlas y desde Delphi usar las opciones de importación y no deberías tener mayores problemas.

DLLImport (si es lo mismo que me suena a mi) es una opción que puedes usar desde .NET para generar DLL's, que pluego puedes usar desde delphi con un LoadLibrary, sin necesidad de registrarlas. Es decir, que te simplifica mucho las cosas.

Te pongo algo de código (de memoria) de cómo sería la Definición/llamada en Delphi; Suponiendo que hayas conseguido usar DLLImport y puedas usarla directament sn registrar.

Código Delphi [-]
...
var 
  // La cabecera de la función asegurate de que tiene el sdtcall;
  funcAdd: function (a:Integer; b:integer):integer; stdcall;

...
var

begin
  ...
  // Cargar la DLL
  FDll := LoadLibrary('add.dll');
  if FDll=0 then
  begin
    ShowMessage('No se ha podido cargar la DLL  );
  end else
  ShowMessage('Dll  cargada correctamente');

  // Intentar acceder al método
  funcAdd:= GetProcAddress(FDll,'SumaNumeros');
  if @funcAdd=nil then
  begin
    ShowMessage('No se ha podido cargar el método SumaNumeros');
  end;

  // llamada a la funcion de suma
  res := funcAdd(3 + 5);

Revisa este link:
http://es.uwenku.com/question/p-wjnivalk-bx.html
Explica lo mismo creo, con algunos detalles más.
__________________
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 20-06-2022
TOLO68 TOLO68 is offline
Miembro
 
Registrado: sep 2016
Posts: 14
Poder: 0
TOLO68 Va por buen camino
Hola a todos !!!

Neftali, muchas gracias, ya pude solucionarlo lo de Suma y Resta, con un conversor de VB6 a Delphi.
Tu ejemplo lo probe, y no me dejaba compilar, me daba errores al cargar la DLL.

La Dll anterior se llamaba add.dll, aqui es fb_dll.dll, es la misma, solo que añadi las funciones Mayusculas y Minusculas.

La DLL la he creado con freebasic, y este es el codigo de la funciones dentro la DLL, por si sirve de algo.
Las 4 funciones, van bien en Visual Basic 6, VB.Net 2010, SharpDevelop y ThinBasic ( en ThinBasic tengo que declarar las funciones como alias, pero es cosa del compilador, me lo dijo el autor)

Código SQL [-]
------------- Codigo DLL FreeBasic-------------

#include once "windows.bi"
#include once "win/ole2.bi"

EXTERN "windows-ms"

    FUNCTION Suma(BYVAL N1 AS Integer, BYVAL N2 AS Integer) AS Integer EXPORT
        RETURN  N1 + N2
    END FUNCTION
    
    FUNCTION Resta(BYVAL N1 AS Integer, BYVAL N2 AS Integer) AS Integer EXPORT
        RETURN N1 - N2
    END FUNCTION
    
    FUNCTION Mayusculas (BYVAL Texto as zString ptr) AS BSTR EXPORT
        DIM res AS BSTR, s AS STRING
        s = UCASE(*Texto)
        res = SysAllocStringByteLen(STRPTR(s), LEN(s))
        RETURN res
    END FUNCTION
    
    FUNCTION Minusculas (BYVAL Texto as zString ptr) AS BSTR EXPORT
        DIM res AS BSTR, s AS STRING
        s = LCASE(*Texto)
        res = SysAllocStringByteLen(STRPTR(s), LEN(s))
        RETURN res
    END FUNCTION
    
END EXTERN

------------- Fin Codigo DLL -------------


Este es el codigo sacado del conversor de VB6, a Delphi o Lazarus.
Para los numeros me va bien.
Pero vi que no me va bien para los string.....

Código Delphi [-]
-------------Codigo Delphi ---------------

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

  function Suma(N1: Smallint; N2: Smallint): Smallint; stdcall; external 'fb_dll.dll' name 'Suma';
  function Resta(N1: Smallint; N2: Smallint): Smallint; stdcall; external 'fb_dll.dll' name 'Resta';
  function Mayusculas(Texto: String): String; stdcall; external 'fb_dll.dll' name 'Mayusculas';

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

////// Label1.Caption := Mayusculas('mipalabra');  <---- Aqui da un error en Delphi 7.0 , o no devuelve nada en Lazarus.

Label1.Caption := IntToStr(Suma(10,22));  <---- Esta funcion va OK

end;
end.

-------------Fin Codigo Delphi ---------------

Realmente esta Dll es para usar en VB o Basic, pero si puedo usarla en mas lenguajes, como por ejemplo Delphi, pues mucho mejor.

Gracias a todos y que tengan un buen dia !!!!!!
Saludos !!!!!

Última edición por Neftali [Germán.Estévez] fecha: 20-06-2022 a las 16:24:58. Razón: Añadir TAG's al mensaje
Responder Con Cita
  #4  
Antiguo 20-06-2022
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.282
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
Gracias por compartirlo.
__________________
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 20-06-2022
TOLO68 TOLO68 is offline
Miembro
 
Registrado: sep 2016
Posts: 14
Poder: 0
TOLO68 Va por buen camino
De nada Neftali.

Pero piensa, que solo funcionan las Sumas y Restas, pero "NO" las Mayusculas ni Minusculas.

Pero es una forma sencilla de llamar a una Dll.

A ver si alguien sabe como hacerlo en Delphi, ya que en VB y demas va bien Mayusculas y Minusculas.

Saludosss!!!
Responder Con Cita
  #6  
Antiguo 21-06-2022
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.282
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
Cita:
Empezado por TOLO68 Ver Mensaje
Pero piensa, que solo funcionan las Sumas y Restas, pero "NO" las Mayusculas ni Minusculas.
Posiblemente por el tipo de dato.
No puedes usar string para DLLs. tendrías que cambiarlo por PChar o PAnsiChar.
__________________
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
  #7  
Antiguo 21-06-2022
TOLO68 TOLO68 is offline
Miembro
 
Registrado: sep 2016
Posts: 14
Poder: 0
TOLO68 Va por buen camino
O sea, en el codigo de delphi o Lazarus....

function Mayusculas(Texto: String): String; stdcall; external 'fb_dll.dll' name 'Mayusculas';

Tengo que cambiar String por Pchar o PAnsichar???

Lo probare, gracias!!!!
Responder Con Cita
  #8  
Antiguo 21-06-2022
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.282
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
Si. Primero prueba con PAnsiChar.
Para trabajar con DLLs lo normal es usar punteros y eso se traduce en PChar o PAnsiChar/PWideChar.
__________________
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
  #9  
Antiguo 21-06-2022
TOLO68 TOLO68 is offline
Miembro
 
Registrado: sep 2016
Posts: 14
Poder: 0
TOLO68 Va por buen camino
Netfali !!!!!!!
Era por estooooo !!!!



Ya lo probe con PAnsiChar y Pchar , en Lazarus, y funciona de las 2 maneras, asi que me imagino que tambien funcionara en Delphi 7.

Lo que me hacia ultimamente, era darme un numero en vez de una palabra, o sea algo leia.

Ahora ya se que FreeBasic crea bien las DLLs, y que no era problema de la Dll, si no por no saber Delphi, esto tambien lo tenia visto en C.

Muchas gracias !!!!!
Me lo apunto en un papel para la proxima vez.

Que tengais todos un buen dia.
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
Llamar una consola de windows desde un form en builder c++? darkmir C++ Builder 7 20-08-2014 07:37:08
Como llamar a las funciones de la Api de Windows? antonio302050 C++ Builder 2 17-11-2010 00:35:39
¿Filas de 1 color y otras de otras En Synedit IDE Delphi? JXJ Varios 1 11-12-2008 00:01:28
Llamar al Visor de Imagenes de windows para abrir un fichero... JoysticK Varios 6 14-09-2008 23:16:08
Como enlazar Aplicaciones externas Micho OOP 2 26-11-2003 22:54:07


La franja horaria es GMT +2. Ahora son las 11:50:19.


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