Función en DllImport

02/07/2007 - 10:51 por Plextor | Informe spam
Hola estoy llamando a una librería realizara en C y la mayoría de las
llamadas a funciones de dicha librería me funcionan correctamente en C#,
pero tengo una en cuestión que me dá problemas.

Os pongo la cabecera del .H para a ver si vosotros me echais un cable:


.H

int DllExport DkReadKey(HANDLE handle, char* buffer, int size, long
offset, int cycles);

Descripción:
buffer: A pointer to the character buffer that receives the data read
from the key.

C#

[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out char[] buffer, int
size, long offset, int cycles);

private int Read_Key()
{
char[] buffer = new char[65];
result = DkReadKey(handle, out buffer, 64, 0, 1);
}

Un saludo,
Plextor

Preguntas similare

Leer las respuestas

#1 RFOG [MS MVP Visual C++]
02/07/2007 - 11:22 | Informe spam
Ese "char *" debe ser un IntPtr con la memoria manejada pinneada. Ten en
cuenta que un char[] es más que una tira de bytes, eso lleva una cabecera
y más cosas.

En Mon, 02 Jul 2007 10:51:58 +0200, Plextor escribió:

Hola estoy llamando a una librería realizara en C y la mayoría de las
llamadas a funciones de dicha librería me funcionan correctamente en C#,
pero tengo una en cuestión que me dá problemas.

Os pongo la cabecera del .H para a ver si vosotros me echais un cable:


.H

int DllExport DkReadKey(HANDLE handle, char* buffer, int size, long
offset, int cycles);

Descripción:
buffer: A pointer to the character buffer that receives the data read
from the key.

C#

[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out char[] buffer, int
size, long offset, int cycles);

private int Read_Key()
{
char[] buffer = new char[65];
result = DkReadKey(handle, out buffer, 64, 0, 1);
}

Un saludo,
Plextor





Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
Debemos buscar para nuestros males otra causa que no sea Dios.
Respuesta Responder a este mensaje
#2 RFOG
02/07/2007 - 11:35 | Informe spam
Eso me pasa por leer demasiado deprisa.

Cambia el "out char[]" por "out byte[]". QUizás el interop por atributos
haga los cambios oportunos.

Estás pasando un array a char que es realmente un array a wchar_t de
código nativo, ya que el .NET trabaja con UNICODE. EL equivalente a "char
*" en C# es byte[].

En Mon, 02 Jul 2007 10:51:58 +0200, Plextor escribió:

Hola estoy llamando a una librería realizara en C y la mayoría de las
llamadas a funciones de dicha librería me funcionan correctamente en C#,
pero tengo una en cuestión que me dá problemas.

Os pongo la cabecera del .H para a ver si vosotros me echais un cable:


.H

int DllExport DkReadKey(HANDLE handle, char* buffer, int size, long
offset, int cycles);

Descripción:
buffer: A pointer to the character buffer that receives the data read
from the key.

C#

[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out char[] buffer, int
size, long offset, int cycles);

private int Read_Key()
{
char[] buffer = new char[65];
result = DkReadKey(handle, out buffer, 64, 0, 1);
}

Un saludo,
Plextor





Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
Debemos buscar para nuestros males otra causa que no sea Dios.
Respuesta Responder a este mensaje
#3 Plextor
02/07/2007 - 11:36 | Informe spam
Entonces, ¿como crees que quedaría la llamara a la función?:

¿Así?... (no funciona)

[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out IntPtr buffer, int
size, long offset, int cycles);

private int Read_Key()
{
IntPtr buffer;
result = DkReadKey(handle, out buffer, 64, 0, 1);
}

Un saluod y gracias por la respuesta

RFOG [MS MVP Visual C++] escribió:
Ese "char *" debe ser un IntPtr con la memoria manejada pinneada. Ten en
cuenta que un char[] es más que una tira de bytes, eso lleva una
cabecera y más cosas.

En Mon, 02 Jul 2007 10:51:58 +0200, Plextor escribió:

Hola estoy llamando a una librería realizara en C y la mayoría de las
llamadas a funciones de dicha librería me funcionan correctamente en C#,
pero tengo una en cuestión que me dá problemas.

Os pongo la cabecera del .H para a ver si vosotros me echais un cable:


.H

int DllExport DkReadKey(HANDLE handle, char* buffer, int size, long
offset, int cycles);

Descripción:
buffer: A pointer to the character buffer that receives the data read
from the key.

C#

[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out char[] buffer, int
size, long offset, int cycles);

private int Read_Key()
{
char[] buffer = new char[65];
result = DkReadKey(handle, out buffer, 64, 0, 1);
}

Un saludo,
Plextor





Respuesta Responder a este mensaje
#4 Plextor
02/07/2007 - 11:40 | Informe spam
He problado lo que me comentas:

[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out byte[] buffer, int
size, long offset, int cycles);

private int Read_Key()
{
byte[] buffer = new byte[65];
result = DkReadKey(handle, out buffer, 64, 0, 1);
}

y me sigue dando el error:
Una llamada a la función PInvoke 'Llave!Llave.Form1::DkReadKey' impidió
la correspondencia de la pila. Es posible que la razón sea que la firma
PInvoke administrada no coincida con la firma de destino no
administrada. Compruebe que la convención y los parámetros de llamada de
la firma PInvoke coinciden con la firma no administrada de destino.

Un saludo
Plextor

Plextor escribió:
Hola estoy llamando a una librería realizara en C y la mayoría de las
llamadas a funciones de dicha librería me funcionan correctamente en C#,
pero tengo una en cuestión que me dá problemas.

Os pongo la cabecera del .H para a ver si vosotros me echais un cable:


.H

int DllExport DkReadKey(HANDLE handle, char* buffer, int size, long
offset, int cycles);

Descripción:
buffer: A pointer to the character buffer that receives the data read
from the key.

C#

[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out char[] buffer, int
size, long offset, int cycles);

private int Read_Key()
{
char[] buffer = new char[65];
result = DkReadKey(handle, out buffer, 64, 0, 1);
}

Un saludo,
Plextor
Respuesta Responder a este mensaje
#5 RFOG
02/07/2007 - 11:59 | Informe spam
En un rato te respondo...

En Mon, 02 Jul 2007 11:40:11 +0200, Plextor escribió:

He problado lo que me comentas:

[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out byte[] buffer, int
size, long offset, int cycles);

private int Read_Key()
{
byte[] buffer = new byte[65];
result = DkReadKey(handle, out buffer, 64, 0, 1);
}

y me sigue dando el error:
Una llamada a la función PInvoke 'Llave!Llave.Form1::DkReadKey' impidió
la correspondencia de la pila. Es posible que la razón sea que la firma
PInvoke administrada no coincida con la firma de destino no
administrada. Compruebe que la convención y los parámetros de llamada de
la firma PInvoke coinciden con la firma no administrada de destino.

Un saludo
Plextor

Plextor escribió:
Hola estoy llamando a una librería realizara en C y la mayoría de las
llamadas a funciones de dicha librería me funcionan correctamente en C#,
pero tengo una en cuestión que me dá problemas.
Os pongo la cabecera del .H para a ver si vosotros me echais un cable:
.H
int DllExport DkReadKey(HANDLE handle, char* buffer, int size, long
offset, int cycles);
Descripción:
buffer: A pointer to the character buffer that receives the data read
from the key.
C#
[DllImport("dkeserialdll.dll")]
public static extern int DkReadKey(int handle, out char[] buffer, int
size, long offset, int cycles);
private int Read_Key()
{
char[] buffer = new char[65];
result = DkReadKey(handle, out buffer, 64, 0, 1);
}
Un saludo,
Plextor







Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
Debemos buscar para nuestros males otra causa que no sea Dios.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida