Passage d'une variable de type utilisateur [Résolu]

Signaler
Messages postés
5
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
9 janvier 2012
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
J'ai besoin de faire passer (dans les deux sens) une variable de type utilisateur vers une fonction DLL. En cherchant du VBFrance, j'ai trouvé la source 6826 de Bertrand P, que j'ai modifiée à ma problématique. Si je peux recevoir de la DLL à l'EXE, je ne peux pas envoyer de l'EXE vers la DLL : je tombe sur l'erreur "type d'argument ByRef incompatible" ! D'où vient l'erreur ?

code:
'Exemple de transfert et récupération
'Fait le 20 avril 2003 par Bertrand P.
'Source VBFrance 6826

'***************'
'* Feuille EXE *'
'***************'
'objects : listBox lstClients
' CommandButton cmdEnvoi
' CommandButton cmdRecept
Option Explicit

Private Sub Form_Load()
'Ne pas oublier la référence de la dll dans le projet
Set DLL = New clsTab
End Sub

Private Sub cmdEnvoi_Click()
Dim ClientJMD As Client
ClientJMD.Nom = "DUPOND"
ClientJMD.Prenom = "Jean-Michel"
DLL.DLL_Recep ClientJMD
End Sub

Private Sub cmdRecept_Click()
Dim ListeClient() As Client
Dim i As Integer
ListeClient() = DLL.DLL_Envoi()
'***
lstClients.Clear
For i = 0 To UBound(ListeClient)
lstClients.AddItem ListeClient(i).Prenom & " " & ListeClient(i).Nom
Next i
End Sub

'**************'
'* Module EXE *'
'**************'

Option Explicit

Public Type Client
Nom As String
Prenom As String
End Type

Public DLL As Transfert_Tab.clsTab

'***************'
'* Feuille DLL *'
'***************'
'object : listBox lstClients

'*************'
'* Class DLL *'
'*************'

Public Type Client
Nom As String
Prenom As String
End Type

Public Sub DLL_Recep(Clt As Client)
TransfertTab.Show
'***
TransfertTab.lstClients.Clear
TransfertTab.lstClients.AddItem Clt.Nom & " " & Clt.Prenom
End Sub

Public Function DLL_Envoi() As Client()
Dim ListeClient(0 To 3) As Client
Dim b As Byte
For b = 0 To 3
ListeClient(b).Nom = Choose(b + 1, "DUPONT", "DURAND", "SCHMIDT", "DOE")
ListeClient(b).Prenom = Choose(b + 1, "Jean", "Michel", "Catherine", "John")
Next b
DLL_Envoi = ListeClient
End Function

9 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Ah, et,
si tu veux que ton code tel quel fonctionne, supprime la déclaration de Type Client de ton Module...

même nom, même déclaration, mais pour VB, ce sont sinon deux types différents (entre ton projet1 et ta dll). Tu ne peux du coup pas utiliser ByRef sur ces Types différents...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Probleme de deesign général...

on voit que tu fais là des essais.
que cherches tu as faire au final ? quel est ton besoin ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
5
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
9 janvier 2012

Exact, je fais des essais de DLLs.
J'ai juste besoin d'envoyer des infos à la DLL.
Plutôt que de passer 36 paramètres (sub XXX (p1,p2,p3,...), j'ai pensé qu'une variable de type perso contenant tous les paramètres d'un seul coup serait plus simple.
Je viens de supprimer la déclaration Client du module ... et ça marche !
... Mais je ne comprend pas pourquoi !!! (malgré l'«Option Explicit» !)
Merci à toi, Renfield !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
L'option Explicit ne règle pas le problème dont t'a parlé RenField.
Son rôle se limite à la vérification de la déclaration effective d'une variable utilisée.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
5
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
9 janvier 2012

Tout compte fait ... non ça ne marche pas !!!
En transposant dans mon vrai projet ... "Type défini par l'utilisateur non défini" !!! J'explique donc un peu plus mon vrai projet (le code ci-dessus n'était qu'un essai).
J'ai créé pour mes élèves plusieurs EXEs d'exercices. Je souhaite les regrouper non pas en un seul EXE, mais utiliser un lanceur (EXE) et des PlugIns (Gally - source 32875) plus rapides que de lancer ShellExecute ...
Je me plonge donc dans le monde des DLLs !!!
J'ai regroupé ces Exercices-PlugIns dans des dossiers différents, le lanceur étant à la racine. Les DLLs ne sont pas avec l'EXE !
Si beaucoup de Plug-Ins sont simples de facture, là, je dois faire passer une variable de type perso (expliqué plus haut) à une DLL.
Je suis un amateur (qui commence tout de même à bien manier les fonctions simples de VB6), peut-être je veux faire trop compliqué !
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
ok...

pub :
http://www.vbfrance.com/code.aspx?ID=34980

l'idée en dessous est toujours la même...

ton type doit etre déclaré UNE seule fois.

Tu devrait :
- faire de ton exe central un Exe ActiveX
- lui faire partager on type perso et autres droleries (Interface, si tu utilises ma source, etc.)
- Chaque plugin lorgnerait dessus et pourrais utiliser le type perso, etc.

contactes moi directement si tu souhaites de l'aide

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
1 décembre 2015

Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
1 décembre 2015

J'ai eu le problème de transport de variable importent

je suis passer par la bas de registre

l'envoyeur de données attend par un while wend le retour
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
par la base de registres ?
pas le plus efficace...

possible de passer par un SendMessage et une zone de mémoire partagée...



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp