Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-11-2006
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 21
acertij022 Va por buen camino
problema con creacion de DLL

Hola delphiano hace una semana pedi ayuda para encriptar string en triple-DES y me recomendaron el componente DCPcrypt http://www.cityinthesky.co.uk/cryptography.html
Bueno todo funciona perfecto pero ahora necesito encapsularlo en una DLL para poder usarlo en otros lenguajes. Al intentar levantar la DLL desde Delphi me sale un error (Invalid pointer operation).
El codigo de la DLL es el siguiente:
Código Delphi [-]
library des;

uses
  SysUtils,
  Classes,
  DCPcrypt2, DCPblockciphers, DCPdes, DCPsha1;

{$R *.res}
        function TripleDes(dato,contrasenia:string;accion:boolean):string; stdcall; overload;
        var
        Cipher: TDCP_3des;
        begin
        Cipher:= TDCP_3des.Create(nil);//(Self);
        Cipher.InitStr(contrasenia,TDCP_sha1);         // initialize the cipher with a hash of the passphrase
        if accion=true then Result:= Cipher.EncryptString(dato)
        else Result:= Cipher.DecryptString(dato);
        Cipher.Burn;
        Cipher.Free;
        end;

        Exports TripleDes(dato,contrasenia:string;accion:boolean);

        begin
        end.
y el codigo en delphi para levantar la DLL es:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    GroupBox1: TGroupBox;
    Memo1: TMemo;
    GroupBox2: TGroupBox;
    Memo2: TMemo;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TripleDes(dato,contrasenia:string;accion:boolean):string; stdcall; external 'DES.DLL';

procedure TForm1.Button1Click(Sender: TObject);
begin
memo2.Text := TripleDes(memo1.Text,edit1.text,true);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo2.Text := TripleDes(memo1.Text,edit1.text,false);

end;

end.
supongo que el error es que uso como parametro NIL en vez de SELF al crear el componente pero si colo este ultimo no me compila([Error] des.dpr(13): Undeclared identifier: 'Self').

Espero que alguien me pueda ayudar desde ya muchas gracias

Última edición por acertij022 fecha: 20-11-2006 a las 14:22:23.
Responder Con Cita
  #2  
Antiguo 20-11-2006
tefots tefots is offline
Miembro
 
Registrado: feb 2005
Posts: 108
Poder: 20
tefots Va por buen camino
Hola

siempres que crees alguna dll , o intentes llamar a alguna funcion que se encuentra en una dll , no puedes usar tipos strings , has de usar pchars.


Código Delphi [-]
function TripleDes(dato,contrasenia : pchar;accion:boolean):string; stdcall;

y para llamar a la funcion , puedes forzar a pchar .


Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
memo2.Text := TripleDes(pchar(memo1.Text),pchar(edit1.text),true);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo2.Text := TripleDes(pchar(memo1.Text),pchar(edit1.text),false);
end;

Última edición por tefots fecha: 20-11-2006 a las 16:47:28.
Responder Con Cita
  #3  
Antiguo 20-11-2006
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 21
acertij022 Va por buen camino
Intente lo que me comentaste usar Pchar en vez de string y me sigue tirando error pero esta ves me tira Acces violation at address 00401C66 in module 'Project1.exe'. Write of address 003809D4

¿que podra ser?
Responder Con Cita
  #4  
Antiguo 20-11-2006
avmm2004 avmm2004 is offline
Miembro
 
Registrado: jun 2006
Ubicación: Santa cruz de Tenerife, Islas Canarias
Posts: 500
Poder: 18
avmm2004 Va por buen camino
Utiliza shortstring en vez de Pchar o strings y no obstante utiliza la unit Sharemem como primera unit de tu dll y de tu programa llamador.
De resto debe de funcionarte bien, por lo menos a mi siguiendo esas reglas no tengo problemas.
Responder Con Cita
  #5  
Antiguo 20-11-2006
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 21
acertij022 Va por buen camino
gracias por el dato avmm2004 pero ahun me sigue tirando error de memoria intentare probarlo en otra pc para descartar.
Responder Con Cita
  #6  
Antiguo 21-11-2006
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 21
acertij022 Va por buen camino
hola de nuevo realice pruebas en otra pc e incluso desintale el windows xp y coloque windows 2000 y sigue el problema.

Para hacer mas simple cree una dll:
Código Delphi [-]
library Project2;

uses
  SysUtils,
  Classes;

{$R *.res}

function sumar(a,b:shortstring):string;stdcall;
begin
Result:= IntToSTr(StrToInt(a)+StrToInt(b));
end;

Exports sumar;
begin
end.

y una aplicacion que suma usando la DLL:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function sumar(a,b:shortstring):string; stdcall; external 'Project2.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption :=  sumar(edit1.Text,edit2.Text);
end;

end.

pero al cliquear en el botón realiza la suma pero coloca un cartel de error:
Invalid pointer operation

Por lo visto hay algo basico que hago mal
Espero que alguien me tire un cable por favor
Responder Con Cita
  #7  
Antiguo 21-11-2006
avmm2004 avmm2004 is offline
Miembro
 
Registrado: jun 2006
Ubicación: Santa cruz de Tenerife, Islas Canarias
Posts: 500
Poder: 18
avmm2004 Va por buen camino
El parámetro que devuleve la función debe ser no string sino shortstring y te repito, utiliza Sharemem la primera de todas en tu sentencia uses en la dll y el programa llamador. Los problemas te vienen por el uso de string y no shortsring.

Pd: Si lo que quieres es sumar dos numeros pasele integer y devuelve integer.(en el ejemplo, claro) veras que si no utilzas string desaparece el error. Los strings es mejor usarlos como te digo, a mi me funciona bien.
Responder Con Cita
  #8  
Antiguo 22-11-2006
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 21
acertij022 Va por buen camino
Muchas gracias avmm2004 y disculpa mi ignorancia habia pasado de alto tambien Sharemem
Responder Con Cita
  #9  
Antiguo 23-11-2006
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 21
acertij022 Va por buen camino
Hola de nuevo he realizado cambio en mi dll y ya no utilizo mas Sharemem porque mi intencion es usarlo en otros entornos (c#) y según lei para ser compatible con cualquier entorno el dato debe ser PChar ya que el string que usa delphi esta compueto por: cantidad de char + array de char y PChar esta compueto por: array de char + chr(0) que indica el final del string Según dice aquí

Muchas gracias a todos!!
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
creación de un XML jmlifi Providers 2 10-01-2006 15:22:27
creacion armando OOP 9 28-10-2005 20:29:37
Problema Creacion-Cancelacion Registros Maury Manosalva OOP 3 20-09-2005 23:18:32
Problema con la creación de Indices apicito Firebird e Interbase 3 20-05-2005 07:22:04
problema con la creacion de informes Mayorlin .NET 2 22-07-2004 19:32:24


La franja horaria es GMT +2. Ahora son las 06:46: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
Copyright 1996-2007 Club Delphi