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:
Mostrar la cita
#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:
Mostrar la cita
primero
Mostrar la cita
Yo
Mostrar la cita
#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:
Mostrar la cita
un
Mostrar la cita
todo
Mostrar la cita
CallingConvention=CallingConvention.StdCall)])]
Mostrar la cita
pondría
Mostrar la cita
así:
Mostrar la cita
#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.
Mostrar la cita
#5 Zephryn Xirdal
14/06/2004 - 13:37 | Informe spam
"Octavio Hernandez" escribió en el mensaje
news:
Mostrar la cita
la
Mostrar la cita
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.
Mostrar la cita
fuera
Mostrar la cita
solo).
Mostrar la cita
Ads by Google
Search Busqueda sugerida