DLL de lector de huellas: DLLImport no me funca
Publicado por Emilio (1 intervención) el 26/07/2008 21:34:12
Estimada gente del foro:
Tengo unas apis que manejan un dispositivo lector de huellas digitales; las mismas están hechas en C (o c++, no se bien
La declaracion original de la funcion dentro de la libreria dll, segun funciona en el manual de instruccione, es:
extern int WINAPI Wis_Diagnose (unsigned char *pwd, SYSTEMDATA CurSystemData);
Esta funcion devuelve valores de acuerdo a si el dispositivo esta on-line, u off-line
A continuacion, va la estructura SYSTEMDATA, completa
typedef struct _SYSTEMDATA
{
unsigned char Version; //DSP version
unsigned char IP[4]; //IP address
unsigned char NetMask[4]; //netmask
unsigned char Gateway[4]; //gateway
unsigned char BaudRate; //baudrate for external
unsigned char DeviceID[3]; //device ID
unsigned short UserNo; //user number
unsigned long LogNo; //log number
unsigned char AuthenMode; //1: 1-1 2: 1:1/1:N(<50 user
unsigned char UartMode; //1:232, 2:485
unsigned char VoiceEN; //1:enable
unsigned char ServerIP[3][4]; //server IP sets
unsigned char IDLength; //ID length for display
unsigned char Reserved[20];
DOORDATA DoorData; //door setting
unsigned char DeviceName[16]; //device name
unsigned char HasDevice; //this parameter should be 3
unsigned char ProtocolPswd; //protocol password
unsigned char Reserved1[7];
}SYSTEMDATA; //112 Bytes
Ahora, como se verá, en medio de la estructura antes declarada, hay otra estructura: DOORDATA; a continuacion, su definicion:
//door data structure
typedef struct _DOORDATA
{
unsigned short DoorOpenSec;
unsigned short DoorOverSec;
unsigned short AlarmTime;
unsigned char AlarmEnable; //0: Disable
unsigned char Reserved[9];
}DOORDATA; //16 bytes
. Ahora, el codigo que he diseñado en VB.NET 2005 es el siguiente:
Structure doordata
Dim DoorOpenSec As Short
Dim DoorOverSec As Short
Dim AlarmTime As Short
Dim AlarmEnable As String
Dim Reserved As String
End Structure
Structure SystemData
Dim Version As String
Dim IP As String
Dim NetMask As String
Dim Gateway As String
Dim BaudRate As String
Dim DeviceID As String
Dim UserNo As Short
Dim LogNo As Long
Dim AuthenMode As String
Dim UartMode As String
Dim VoiceEN As String
Dim ServerIP() As String
Dim IDLength As String
Dim Reserved As String
Dim DoorData As doordata
Dim DeviceName As String
Dim HasDevice As String
Dim ProtocolPswd As String
Dim Reserved1 As String
End Structure
y la declaracion de DLLImport es, como sigue, segun miré en el MSDN:
<DllImport("C:WisClient.dll", EntryPoint:="Wis_Diagnose", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function Diagnostico( _
ByVal pwd As String, _
ByRef systemdata As SystemData) _
As Integer
' Leave the body of the function empty.
End Function
Y por ultimo, el error que me sale cuando intento mostrar el resultado de esta funcion en un msgbox es:
Se detectó PInvokeStackImbalance
Message: Una llamada a la función PInvoke 'CVHuella!CVHuella.FrmPruebaDispositivo:iagnostico' 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.
Espero que me puedan dar una mano en esto, les voy a estar muy agradecido!!
MUchas gracias desde ya!
Tengo unas apis que manejan un dispositivo lector de huellas digitales; las mismas están hechas en C (o c++, no se bien
La declaracion original de la funcion dentro de la libreria dll, segun funciona en el manual de instruccione, es:
extern int WINAPI Wis_Diagnose (unsigned char *pwd, SYSTEMDATA CurSystemData);
Esta funcion devuelve valores de acuerdo a si el dispositivo esta on-line, u off-line
A continuacion, va la estructura SYSTEMDATA, completa
typedef struct _SYSTEMDATA
{
unsigned char Version; //DSP version
unsigned char IP[4]; //IP address
unsigned char NetMask[4]; //netmask
unsigned char Gateway[4]; //gateway
unsigned char BaudRate; //baudrate for external
unsigned char DeviceID[3]; //device ID
unsigned short UserNo; //user number
unsigned long LogNo; //log number
unsigned char AuthenMode; //1: 1-1 2: 1:1/1:N(<50 user
unsigned char UartMode; //1:232, 2:485
unsigned char VoiceEN; //1:enable
unsigned char ServerIP[3][4]; //server IP sets
unsigned char IDLength; //ID length for display
unsigned char Reserved[20];
DOORDATA DoorData; //door setting
unsigned char DeviceName[16]; //device name
unsigned char HasDevice; //this parameter should be 3
unsigned char ProtocolPswd; //protocol password
unsigned char Reserved1[7];
}SYSTEMDATA; //112 Bytes
Ahora, como se verá, en medio de la estructura antes declarada, hay otra estructura: DOORDATA; a continuacion, su definicion:
//door data structure
typedef struct _DOORDATA
{
unsigned short DoorOpenSec;
unsigned short DoorOverSec;
unsigned short AlarmTime;
unsigned char AlarmEnable; //0: Disable
unsigned char Reserved[9];
}DOORDATA; //16 bytes
. Ahora, el codigo que he diseñado en VB.NET 2005 es el siguiente:
Structure doordata
Dim DoorOpenSec As Short
Dim DoorOverSec As Short
Dim AlarmTime As Short
Dim AlarmEnable As String
Dim Reserved As String
End Structure
Structure SystemData
Dim Version As String
Dim IP As String
Dim NetMask As String
Dim Gateway As String
Dim BaudRate As String
Dim DeviceID As String
Dim UserNo As Short
Dim LogNo As Long
Dim AuthenMode As String
Dim UartMode As String
Dim VoiceEN As String
Dim ServerIP() As String
Dim IDLength As String
Dim Reserved As String
Dim DoorData As doordata
Dim DeviceName As String
Dim HasDevice As String
Dim ProtocolPswd As String
Dim Reserved1 As String
End Structure
y la declaracion de DLLImport es, como sigue, segun miré en el MSDN:
<DllImport("C:WisClient.dll", EntryPoint:="Wis_Diagnose", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function Diagnostico( _
ByVal pwd As String, _
ByRef systemdata As SystemData) _
As Integer
' Leave the body of the function empty.
End Function
Y por ultimo, el error que me sale cuando intento mostrar el resultado de esta funcion en un msgbox es:
Se detectó PInvokeStackImbalance
Message: Una llamada a la función PInvoke 'CVHuella!CVHuella.FrmPruebaDispositivo:iagnostico' 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.
Espero que me puedan dar una mano en esto, les voy a estar muy agradecido!!
MUchas gracias desde ya!
Valora esta pregunta


0