Passage d'une variable de type utilisateur

Résolu
Vijbam Messages postés 5 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 9 janvier 2012 - 7 janv. 2012 à 13:53
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 11 janv. 2012 à 07:14
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
9 janv. 2012 à 08:08
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
9 janv. 2012 à 08:02
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
0
Vijbam Messages postés 5 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 9 janvier 2012
9 janv. 2012 à 11:16
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 !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 219
9 janv. 2012 à 11:22
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vijbam Messages postés 5 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 9 janvier 2012
9 janv. 2012 à 12:16
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é !
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
9 janv. 2012 à 12:47
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
0
Orlean2 Messages postés 50 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 1 décembre 2015
10 janv. 2012 à 18:57
0
Orlean2 Messages postés 50 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 1 décembre 2015
10 janv. 2012 à 19:00
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
11 janv. 2012 à 07:14
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
0