Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > .NET
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
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
Dll de delphi en C#

Hola buenas tardes, les molesto porque tengo un problema y necesito de su ayuda:
Tengo una DLL realizada en delphi 6 para encriptar y desencriptar string con el siguiente codigo:
Código Delphi [-]
library Rijndael;

uses
  DCPcrypt2, DCPblockciphers, DCPrijndael, DCPsha1;

{$R *.res}
function Encriptar(Dato, Clave1, Accion :PChar):PChar; export;
var
  DCP_rijndael1: TDCP_rijndael;
  my_message, key : string;
begin
  my_message := Dato;
  key        := Clave1;

  DCP_rijndael1:= TDCP_rijndael.Create(nil);
  DCP_rijndael1.InitStr(Key,TDCP_sha1);         // initialize the cipher with a hash of the passphrase
  if Accion = PChar('0') then  Result := PChar(DCP_rijndael1.DecryptString(my_message))
  else Result := PChar(DCP_rijndael1.EncryptString(my_message));
  DCP_rijndael1.Burn;
  DCP_rijndael1.Free;
end;
Exports Encriptar;
begin
end.
El cual funciona perfectamente en delphi pero al intentar usarlo en C# con el siguiente codigo:
Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace prueba
{
    public partial class Form1 : Form
    {
        [DllImport("Rijndael.dll")]
        public static extern String Encriptar(string Dato, string Clave1, string Accion);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            textBox2.Text = Encriptar(textBox1.Text, textBox3.Text, "1");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox2.Text = Encriptar(textBox1.Text, textBox3.Text,"0");
        }
    }
}
Al intentar usar la DLL me tira el error:
No se controló System.AccessViolationException
Message="Intento de leer o escribir en la memoria protegida. A menudo, esto indica que hay otra memoria dañada."
Source="prueba"
StackTrace:
en prueba.Form1.Encriptar(String Dato, String Clave1, String Accion)
en prueba.Form1.button1_Click(Object sender, EventArgs e) en C:\Documents and Settings\wloose\Escritorio\prueba123\prueba\Form1.cs:línea 27
en System.Windows.Forms.Control.OnClick(EventArgs e)
en System.Windows.Forms.Button.OnClick(EventArgs e)
en System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
en System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
en System.Windows.Forms.Control.WndProc(Message& m)
en System.Windows.Forms.ButtonBase.WndProc(Message& m)
en System.Windows.Forms.Button.WndProc(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
en System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
en System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
en System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
en System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
en System.Windows.Forms.Application.Run(Form mainForm)
en prueba.Program.Main() en C:\Documents and Settings\wloose\Escritorio\prueba123\prueba\Program.cs:línea 17
en System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
en System.Threading.ThreadHelper.ThreadStart_Context(Object state)
en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
en System.Threading.ThreadHelper.ThreadStart()

supongo que el error es por incompatibilidad en las variable pero me resulta extraño por que uso variable tipo PChar en la DLL que son compatible con string en C# (el array de char termina con 0x00) alguno me podria ayudar o orientarme cual es el problema.
Desde ya muchas gracias
Responder Con Cita
  #2  
Antiguo 27-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
Aporto un dato mas, estuve haciendo pruebas:

Solo no me tira error cuando el dato que entrega la función es estatico ejemplo:
Código Delphi [-]
library Rijndael;

uses
    SysUtils,  Classes;

{$R *.res}

function GetOne(DATO:Pchar): PChar; export;
begin
   Result := 'One';
end;

Exports GetOne;
begin
end.
Si encambio si el resultado debe intercatuar con la entrada (es lo que quiero) me tira el error que mencione en el pos anterior
Responder Con Cita
  #3  
Antiguo 27-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No te ofreceré la solución a tu problema, pero, al menos podré demostrar cómo utilizar una DLL escrita en Delphi tanto en Delphi como en CSharp. Se trata de una DLL "Cifrador.dll" que cuenta, precisamente, con una sola función que puede usarse para cifrar y descifrar cadenas. Nada.

Para compilar la DLL será necesario contar, pues, con la última versión (Beta) de los componentes DCPcrypt para Delphi de David Barton. Por otro lado hago uso de la unidad "UCifrador.pas" que hace poco adjunté en otro Hilo en que tratamos de estos componentes.

En cuanto a la aplicación cliente que utiliza la DLL "Cifrador.dll" escrita en CSharp he utilizado el programa CSharp Develop. Para la aplicación cliente escrita en Delphi he utilizado Delphi 7.

Pero, en fin, lo mejor es que le eches un vistazo. En el archivo que enlazo a continuación se incluye el código fuente de la DLL "Cifrador.dll", el código fuente de la aplicación escrita en Delphi y el de la escrita en CSharp.

Sin embargo también podrán encontrarse los binarios, tanto de la DLL como de las aplicaciones. Tú échale un vistazo al asunto y nos cuentas qué sacas en claro, los problemas que te encuentres, en fin, que ya sabes dónde estamos.

Usar DLL de Delphi tanto en Delphi como en CSharp, 493 KB en formato Zip

* Nota: Para ejecutar la aplicación (escrita en CSharp) ya compilada será preciso el .NET FrameWork Redistributable Package 2.0 (ahí queda eso).
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 27-11-2006 a las 16:45:22.
Responder Con Cita
  #4  
Antiguo 27-11-2006
Avatar de __hector
[__hector] __hector is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Santo Domingo, Rep. Dom.
Posts: 1.075
Poder: 22
__hector Va por buen camino
Si de encriptar y desencriptar en .net se trata, lo mejorcito que he visto es:

http://www.codeproject.com/dotnet/xcrypt.asp
__________________
Héctor Geraldino
Software Engineer
Responder Con Cita
  #5  
Antiguo 28-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 a todos encontre el porque que no era compatible la DLL con C# es porque me faltaba cdecl
en la funcion al final como dice aquí
Responder Con Cita
  #6  
Antiguo 28-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Es posible que sea lo que dices, pero, en el "ejemplo" que preparé no hago uso de esa palabra clave y todo parece funcionar bien... échale un vistazo. Comprendo que no era la solución que precisabas, pero, tal vez puedas adaptarlo a tus necesidades.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 16-01-2009
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
DEC: Ya no se encuentra el enlace

Revivo este hilo -que ya hace bastante estaba empolvado-

DEC: el enlace de tu ejemplo no existe, ¿lo tendras en algun otro lado?

Andamos explorando por el lado de C#
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #8  
Antiguo 10-02-2015
cmfab cmfab is offline
Miembro
 
Registrado: jun 2010
Posts: 419
Poder: 14
cmfab Va por buen camino
Hola acertij022, tengo el mismo problema que plateaste, pero en mi caso no le veo la solución, uso los mismos componentes que tu en la dll delphi para encriptar y desencriptar pero no me funciona desde c#, podrías poner el código exacto en c# con el que pudiste correr la aplicación, Gracias de antemano
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
Consulta Delphi 6, Delphi 2005 y Delphi 2006 Leviatan Varios 6 18-08-2007 16:02:08


La franja horaria es GMT +2. Ahora son las 22:57:04.


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