none
Uso de DLL de un lector de huellas: DLLImport no me funciona... RRS feed

  • Pregunta

  •  

    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 VersionDevil;  //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 ProtocolPswdMusic;  //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!

    • Cambiado Enrique M. Montejo jueves, 9 de junio de 2011 17:10 interoperabilidad (De:Lenguaje VB.NET)
    viernes, 25 de julio de 2008 20:38