[VB] Third party dll's aanroepen in VB

Pagina: 1
Acties:
  • 260 views sinds 30-01-2008
  • Reageer

  • Redbull4u
  • Registratie: December 2003
  • Laatst online: 04-05 11:07
Mensen,
Hier op het werk zijn we aan het testen met de Philips Mifare RD700 smartcard reader. Hierbij willen we informatie op een RFID kaart uitlezen door middel van een VB progamma. Dit moet volgens ons kunnen aangezien er dll bestanden op de bijgeleverde cd staan. We hebben enige kennis van VB en dll's maar blijkbaar niet genoeg om dit probleem op te lossen.

We hebben een nieuw project aangemaakt met een nieuw formulier, we benaderen de dll op de volgende manier:
Private Declare Function PcdGet_Snr Lib "MfRc500.dll" Alias "PcdGetSnr" () As Long

Private Sub Form_Load()

MsgBox PcdGet_Snr()

End Sub
Dit geeft de volgende melding:
Can't find dll entry point PcdGetSnr in MfRc500.dll
We hebben geprobeerd om de dll als referentie toe te voegen maar dit gaat niet.
We hebben geprobeerd om de dll te registreren d.m.v. regsrv32 maar dit gaat ook niet.

De bijgeleverde documentatie zegt het volgende over de functie:
PcdGetSnr

signed char PcdGetSnr (unsigned char * snr)
Cmd-Code: 0x22
IN
OUT snr (4)

Parameters:
snr (OUT) 4 bytes serial number of the reader IC

Returns:
MI_OK

This function reads out 4 bytes serial number of the reader IC. The serial number is unique for all
delivered readers.
Op de bijeleverde CD staat een voorbeeld programma geschreven in C++ dit werkt dus de hardware is goed. We hebben een vermoeden dat de dll's ook geschreven zijn in C++

Het is duidelijk dat we wat verkeerd doen, mogen we er wel van uit gaan dat deze dll met VB te benaderen is? Roepen we de dll of de functie verkeerd aan?

Al vast bedankt voor jullie hulp

If it does not kill u, it makes u stronger


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21:38

Robtimus

me Robtimus no like you

PcdGetSnr verwacht een input parameter van type unsigned char*, maar jij declared hem zonder parameters. Zou je daar niet eerst eens naar kijken?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Redbull4u
  • Registratie: December 2003
  • Laatst online: 04-05 11:07
IceManX schreef op dinsdag 19 juli 2005 @ 08:58:
PcdGetSnr verwacht een input parameter van type unsigned char*, maar jij declared hem zonder parameters. Zou je daar niet eerst eens naar kijken?
De helpfile is hier toch dubbel in, in de functie naam staat inderdaad dat hij een unsigned char verwacht, maar in de omschrijving staat IN leeg, waar OUT wel omschreven wordt.

Overigens maakt het voor de foutmelding niet uit of ik een waarde mee geef of niet.

If it does not kill u, it makes u stronger


  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 19-03 00:48

ZaZ

Tweakers abonnee

gokje...


Visual Basic:
1
2
3
4
5
6
Private Declare Function PcdGetSnr Lib "MfRc500.dll" (ByVal sUnk as String) As Long

Private Sub Form_Load()
  Dim sUnk as String
  MsgBox PcdGetSnr(sUnk)
End Sub

Lekker op de bank


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
De methode returned alleen een MI_OK waarde, om het serienummer uit te lezen zul je moeten kijken wat er in de parameter gestopt is.

  • Redbull4u
  • Registratie: December 2003
  • Laatst online: 04-05 11:07
ZaZ schreef op dinsdag 19 juli 2005 @ 09:29:
gokje...


Visual Basic:
1
2
3
4
5
6
Private Declare Function PcdGetSnr Lib "MfRc500.dll" (ByVal sUnk as String) As Long

Private Sub Form_Load()
  Dim sUnk as String
  MsgBox PcdGetSnr(sUnk)
End Sub
Nog altijd dezelfde foutmelding :'(
Ik heb voor het gemak de DLL ook even online gezet:
MfRc500.dll

If it does not kill u, it makes u stronger


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Als je nou ook ff het stukje relevante C++ voorbeeld code post :)

[ Voor 13% gewijzigd door riezebosch op 19-07-2005 09:45 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Redbull4u
  • Registratie: December 2003
  • Laatst online: 04-05 11:07
Serpie schreef op dinsdag 19 juli 2005 @ 09:39:
De methode returned alleen een MI_OK waarde, om het serienummer uit te lezen zul je moeten kijken wat er in de parameter gestopt is.
Ook hier vind ik de functie beschrijving onduidelijk. Enerzijds hebben ze het over de returned MI_OK waarde, maar ze hebben het ook over een 4 bytes serial numer. Overigens is dit nog maar de test functie. Bijna alle andere functies die ik nodig heb, hebben geen return waarde. Vandaar ook dat ik deze als test gepakt heb.

In ieder geval, ook de andere functies zonder return waarde geven dezelfde foutmelding.

Ik ben er dus nog niet uit, wel top dat jullie op dit (enigsinds) vroege tijdstip al volop meedenken _/-\o_ .

If it does not kill u, it makes u stronger


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 04-05 22:29

Gerco

Professional Newbie

Kijk eens met de dependancy walker naar die DLL (zit bij VB, depends.exe), dan kun je de echte namen van de functies zien en weet je zeker dat je de goede aanroep doet.

[ Voor 5% gewijzigd door Gerco op 19-07-2005 09:58 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Redbull4u
  • Registratie: December 2003
  • Laatst online: 04-05 11:07
C++ Code
///////////////////////////////////////////////////////////////////////
// R E A D S N R O F R E A D E R I C
///////////////////////////////////////////////////////////////////////
char PcdGetSnr(unsigned char* snr)
{
signed char status;

status = PcdReadE2(0x08,0x04,snr);
return status;
}
Header file (alle niet relevante functie verwijzingen zijn verwijderd):
#ifndef PCDSHARED_H
#define PCDSHARED_H

// General Include File for serveral defines concerning conditional library // compilation and microcontroller usage #include "OsDefs.h"

#ifdef __cplusplus
extern "C"
{
#endif

// define function prefix for convinience #define FCT_PREF DLLEXP_IMP RET_STATUS CALL_CONV

/// Read Serial Number from Reader IC
FCT_PREF PcdGetSnr(unsigned char *snr);

#ifdef __cplusplus
}
#endif

#endif // PCDSHARED_H

If it does not kill u, it makes u stronger


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
Ik heb het even opgezocht, ik krijg de dll niet aan de gang maar volgens mij moet je voor de unsigned char een bytearray meegegeven, daarin wordt dan het serienummer gezet.

Even wat eigen code doorgespit, apicalls is echt een ramp van vb naar c++ volgens mij moet hij als volgt:
code:
1
2
3
4
5
6
Private Declare Function PcdGetSnr Lib "MfRc500.dll" (ByVal sUnk as Long) As Long 

Public sub mtdTest
  Dim mvrBuffer(0 To 4) As Byte
  PcdGetSnr mvrBuffer
end sub

na de aanroep moet je van de bytearray nog even een string maken.

[ Voor 3% gewijzigd door Serpie op 19-07-2005 10:02 ]


  • Redbull4u
  • Registratie: December 2003
  • Laatst online: 04-05 11:07
'Dependacy Walker' heb ik inderdaad naar gekeken. Dit is het resultaat voor deze functie:
Ordinal: 67 (0x0043)
Hint: 66 (0x0042)
Function: _PcdGetSnr@4
Entry: 0x00002010
Wat ik hier apart vond is dat er ineens een _ voor de functie naam stond. Alle mogelijkheden omtrend de _ en de @4 geprobeerd, maar geen ander resultaat.

If it does not kill u, it makes u stronger


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 04-05 22:29

Gerco

Professional Newbie

Die @4 geeft imo aan dat de functie 4 bytes als parameters op de stack nodig heeft (precies 1 pointer). Volgens mij is dit het resultaat van name mangling, ik heb daar vanuit VB nog niet mee te maken gehad, dus ik kan je er helaas ook niet mee helpen, alleen op wijzen.

Heb je al alleen de _ geprobeerd (dus zonder de @4) ?

[ Voor 14% gewijzigd door Gerco op 19-07-2005 10:11 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Redbull4u
  • Registratie: December 2003
  • Laatst online: 04-05 11:07
Ik heb alle mogelijk manieren geprobeerd. Kan het zijn dat het een dll is wat sowieso niet in VB gebruikt kan worden? Ik dacht altijd dat dll bestanden juist voor VB omgeving bedoeld was...

If it does not kill u, it makes u stronger


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 04-05 22:29

Gerco

Professional Newbie

vziw kun je bijna elke dll in VB gebruiken, alleen diegenen die bijvoorbeeld parameters gebruiken met datatypes die VB niet kent kun je niets mee. Dat is hier niet het geval, dus ik denk dat dit wel moet kunnen op de 1 of andere manier, vraag me alleen niet hoe.

Dll bestanden zijn gemaakt om functionaliteit te delen tussen applicaties en om code van elkaar te kunnen scheiden in losse modules, heeft niets met VB te maken. Het gebruiken van non-activex dll's in VB is zowiezo een beetje een hack, dus het zou kunnen dat er beperkingen aan zitten die niet gedocumenteerd zijn.

Misschien heb je hier wat aan: Calling a C++ DLL from Visual Basic

[ Voor 27% gewijzigd door Gerco op 19-07-2005 10:51 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Sowieso geven ze in het C++ voorbeeldje al 3 parameters mee: een 0x08, een 0x04 en daarna nog een snr.

[Edit]
Sorry. Dat is voor de Read. Niet voor het verkrijgen van het serialnumber...

[ Voor 31% gewijzigd door riezebosch op 19-07-2005 10:49 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
Redbull4u schreef op dinsdag 19 juli 2005 @ 10:42:
Ik heb alle mogelijk manieren geprobeerd. Kan het zijn dat het een dll is wat sowieso niet in VB gebruikt kan worden? Ik dacht altijd dat dll bestanden juist voor VB omgeving bedoeld was...
Naast mijn declaratie hierboven als long kun je ook nog proberen om de parameter te declareren as Byte of String.
Als je hem declareert als string moet je heb alleen meegeven as string * 4 (string van 4 bytes)

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Redbull4u schreef op dinsdag 19 juli 2005 @ 10:02:
C++:
1
2
3
4
5
6
7
8
9
10
///////////////////////////////////////////////////////////////////////
// R E A D S N R O F R E A D E R I C
///////////////////////////////////////////////////////////////////////
char PcdGetSnr(unsigned char* snr)
{
signed char status;

status = PcdReadE2(0x08,0x04,snr);
return status;
}

[...]
Als ik dit zo bekijk, roepen zij niet een functie in de DLL aan, maar hebben ze intern een functie gemaakt voor het verkrijgen van het serienummer welke gewoon (op een speciale manier) de PcdReadE2 in de DLL aanroept.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1