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

#1 Octavio Hernandez
09/06/2004 - 00:51 | Informe spam
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???


Respuesta Responder a este mensaje
#2 Zephryn Xirdal
09/06/2004 - 10:27 | Informe spam
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???
>
>


Respuesta Responder a este mensaje
#3 Octavio Hernandez
10/06/2004 - 23:07 | Informe spam
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).

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???
> >
> >
>
>


Respuesta Responder a este mensaje
#4 Roberto
12/06/2004 - 07:58 | Informe spam
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
#5 Zephryn Xirdal
14/06/2004 - 13:37 | Informe spam
"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???
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida