2013-08-31 3 views
0

Dans mon projet, je dois décoder les puces, le décodage a d'abord été fait avec un compilateur C++ et un DLL file. Heureusement la validation du décodage avec C++ est faite et fonctionne.Comment puis-je récupérer un paramètre char * à partir d'un fichier DLL C, en utilisant VB6

les fonctions dll C importés sont les suivants:

short int Byte_read(BOOL Mode,int cm, char* tet, char* stat, char* adr, char* nbr, char* data); 

Mais malheureusement, mon décodage test avec VB6 et le même fichier DLL ne fonctionne pas. J'ai fait plusieurs tests et je ne peux toujours pas lire la puce. Je dois être en mesure de décoder avec VB6 et ne peut pas comprendre où la faute est ou si je manque des instructions sur la façon d'y parvenir?

Le code VB6 qui est non fonctionnelle est la suivante:

Const DATA_ARRAY = 129 

Private Sub Command2_Click() 


Dim x As Long 
Dim CData(DATA_ARRAY) As Byte 
Dim buffer(3) As Byte 

x= lire(True, 1, "2", buffer, "00", "09", CData) 

S'il vous plaît vérifier avec moi si le code est correct ou non vous remercie de me aider et me rendre service est important pour moi.

+0

Êtes-vous absolument certain que vous n'avez pas de problème matériel? –

+0

Oui, pas de problème matériel car j'ai déjà validé le décodage avec C et j'ai vu des leds clignotantes. – mahader

Répondre

0

Certains paramètres de Byte_read sont des tableaux de caractères plutôt que des chaînes.

Il existe un related answer qui explique comment accéder aux paramètres de chaîne.

Essayez comme une alternative:

Private Declare Function Byte_read Lib "RFID_VC_VB1.dll" (_ 
ByVal Mode As Long, _ 
ByVal nCom As Long, _ 
ByRef head() As byte, _ 
ByRef status() As byte, _ 
ByRef adresse() As byte, _ 
ByRef number() As byte, _ 
ByRef Data() As byte) As Long 

Vous devez cartographier les chaînes aux tableaux d'octets. Faire usage du fait que le dernier octet est nul.

+0

erreur: Type incompatibilité: type de tableau ou défini par l'utilisateur attendu – mahader

0

Votre declare semble correct. Le problème est avec la déclaration des paramètres réels. Ces tableaux d'octets sont castés à Stringset sont passés ByVal pour que tout ce qui est retourné soit rejeté juste après l'appel.

Pour les paramètres de chaîne de sortie pour obtenir des données celles-ci doivent être affectées par l'appelant comme celui-ci

Dim CData  As String 
Dim buffer  As String 
... 

CData = String$(DATA_ARRAY + 1, 0) 
buffer = String$(3 + 1, 0) 
retour_byte_read = Byte_read(True, 1, "2", buffer, "00", "09", CData) 
CData = Left$(CData, InStr(CData, Chr$(0)) - 1) 
buffer = Left$(buffer, InStr(buffer, Chr$(0)) - 1) 

Debug.Print CData, buffer 

Notez qu'il est la responsabilité des appelants d'allouer suffisamment d'espace pour le cas « pire » - il par documenté dans la référence de la fonction C

Notez également que les chaînes ByVal dans les déclarations VB6 ne sont pas passées ByVal - il s'agit d'un hack pour marquer les paramètres de chaîne comme type char* (ANSI). VB6 fait la conversion unicode -> ANSI avant d'appeler la fonction et ANSI -> unicode arrière après l'appel de la fonction, de sorte que vous obtenez une belle "chaîne VB" dans vos paramètres de chaîne de sortie.

+0

J'ai essayé de faire la même chose que CData et bueffer pour "tête, numéro et adresse" mais toujours pas de résultat positif. – mahader

Questions connexes