delphi procedure

09/06/2004 - 00:04 por Oscar Galvis | Informe spam
tengo una dll con este par d procedimientos...

procedure _EncryptDB(pS: ShortString;var strResult:
ShortString);Stdcall;External 'commonr.dll';
procedure _DecryptDB(pS: ShortString;var strResult:
ShortString);Stdcall;External 'commonr.dll';

y necesito consumirlos desde c# ...



alguna Idea???

Preguntas similare

Leer las respuestas

#6 Oscar Galvis
15/06/2004 - 16:35 | Informe spam
gracias Roberto.. mi problema va mas a como recibo los tipos de datos.


"Roberto" wrote in message
news:1b8f501c45042$41b74550$
Hola:

Para llamar a una función contenida en una dll desde una
aplicación en C# puedes usar DllImport. Encontrarás
información sobre el tema en la ayuda de Visual Studio.

Saludos,

Roberto.
tengo una dll con este par d procedimientos...

procedure _EncryptDB(pS: ShortString;var strResult:
ShortString);Stdcall;External 'commonr.dll';
procedure _DecryptDB(pS: ShortString;var strResult:
ShortString);Stdcall;External 'commonr.dll';

y necesito consumirlos desde c# ...



alguna Idea???


.

Respuesta Responder a este mensaje
#7 Oscar Galvis
16/06/2004 - 02:49 | Informe spam
Muchas Gracias por todas sus colaboraciones ... les cuento como lo
respondi...

[DllImport("commonr.dll", CallingConvention=CallingConvention.StdCall)]

static extern void _EncryptDB(

[MarshalAs(UnmanagedType.LPArray)] byte[] strToEncrypt,

[MarshalAs(UnmanagedType.LPArray)] byte[] strResult );



private void button1_Click(object sender, System.EventArgs e)

{


System.Text.UnicodeEncoding enc = new System.Text.UnicodeEncoding();

byte[] toEnc = new byte[256];

byte[] toEnc1 = new byte[256];

toEnc = System.Text.Encoding.ASCII.GetBytes(e1.Text); // texto a encriptar

toEnc1[0] = (byte)e1.Text.Length;

for(int i=0; i<toEnc.Length ; i++){

toEnc1[i+1] = toEnc[i];

}

byte[] str = new byte[256];

_EncryptDB(toEnc1, str);

e2.Text = System.Text.Encoding.ASCII.GetString(str).Substring(1); // texto
encriptado

}


"Zephryn Xirdal" wrote in message
news:
"Octavio Hernandez" escribió en el mensaje
news:
> Hola,
>
> Muy buena idea lo de usar código unsafe en lo que yo ni pensé, pero me


da
la
> impresión que el problema está en el PRIMER parámetro cadena. El
> procedimiento Delphi espera recibir esa cadena POR VALOR (256 bytes en


la
> pila).

Pues desde mi punto de vista está crudo. Si se tuviera acceso al puntero


de
la pila se podría expandir la misma y colocar allí la cadena, y luego
modificar el punto de retorno para que cuando se descomprima la misma


vuelva
al mismo sitio y no al quinto infierno, pero me parece que eso el C# no


deja
hacerlo de ninguna forma, cosa que en C es "relativamente" fácil de hacer


a
través de ensamblador.
>
> Slds - Octavio
>
> "Zephryn Xirdal" escribió en el
> mensaje news:
> > Hola.
> >
> > ¿No sería más fácil algo como esto?
> >
> > int TamArray;
> > unsafe
> > {
> > TamArray=*<deDondeVengaLaCadena>; //Obtenemos el tamaño del


array
> > }
> > char Array=new char[TamArray];
> > unsafe
> > {
> > //Podríamos trabajar directamente con <deDondeVengaLaCadena> si
fuera
> un
> > char* nativo
> > char *pInicioCadena=<deDondeVengaLaCadena>;
> > for(int i=1;i<TamArray;i++)
> > Array[i-1]=pInicioCadena[i]; /*o *(pInicioCadena+i);*/
> > }
> >
> > Espero no haber metido mucho la pata, porque estoy aprendiendo el C# y
> todo
> > lo anexo al mismo, pero esta solución me parece mucho más óptima y


corta
> > (otra cosa es que funcione).
> >
> >
> > "Octavio Hernandez" escribió en el mensaje
> > news:
> > > Oscar,
> > >
> > > Interesante problema. En principio creo que sería algo así:
> > >
> > > [DllImport("commonr.dll",
> CallingConvention=CallingConvention.StdCall)])]
> > > void _EncryptDB(ShortString pS, ref ShortString strResult);
> > >
> > > El problema es que hay que definirse un tipo ShortString en C# que


se
> > > corresponda con la arquitectura de las cadenas cortas de Pascal. Un
> > > ShortString en Delphi es un array empaquetado de 256 bytes, donde el
> > primero
> > > contiene la longitud real de la cadena y los otros 255 - los


posibles
> > > caracteres (en Delphi no se usan caracteres de 2 bytes, sino de 1
solo).
> > Yo
> > > definiría una estructura (debería ser un tipo valor) y de paso le
> pondría
> > > métodos para transformar de String a esa estructura y viceversa.


Algo
> así:
> > >
> > > [StructLayout(LayoutKind.Sequential, Pack=1)]
> > > struct ShortString {
> > > // *** datos
> > > byte Longitud;
> > > byte caracter000;
> > > byte caracter001;
> > > // etc.
> > > byte caracter255;
> > > // *** métodos
> > > ShortString(String valorCS) { /* programar */ }
> > > public override string ToString() { /* programar */ }
> > > }
> > >
> > > Salu2 - octavio
> > >
> > > "Oscar Galvis" escribió en el mensaje
> > > news:
> > > > tengo una dll con este par d procedimientos...
> > > >
> > > > procedure _EncryptDB(pS: ShortString;var strResult:
> > > > ShortString);Stdcall;External 'commonr.dll';
> > > > procedure _DecryptDB(pS: ShortString;var strResult:
> > > > ShortString);Stdcall;External 'commonr.dll';
> > > >
> > > > y necesito consumirlos desde c# ...
> > > >
> > > >
> > > >
> > > > alguna Idea???
> > > >
> > > >
> > >
> > >
> >
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida