Appeler une fonction VB à partir de C++

cs_doggyk Messages postés 21 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 12 mars 2005 - 7 déc. 2004 à 09:11
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 18 déc. 2004 à 12:21
Bonjour à tous!

Voilà, je souhaiterais appeler une fonction VB à partir d'une DLL C++ (appelée auparavant par mon prog VB).
En gros:
Démarrage du prog Y en Visual Basic qui Appelle la fonction X appartenant à la DLL Z
Puis, au cours de son éxécution la Fonction X de la Dll Z appelle la fonction W du prog Y.
Je sais pas si c'est très clair...

Bon, d'après mes premières investigations il y aurait peut-être une possibilité en envoyant à ma Dll l'adresse de la fonction à rappeler grâce à l'operateur AddressOf de VB.
Le truc, c'est que j'ai lu cela, j'arrive à l'utiliser dans VB, mais j'ai pas trouvé d'exemples montrant comment le C++ se sert de l'adresse de cette fonction pour la rappeler.

Mon problème se situe donc juste à appeler la fonction VB à partir de C++.

Si quelqu'un a déjà eu à faire ce genre de bidouille je serais interressé par son aide!

Merci d'avance.

Doggyk.

7 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
7 déc. 2004 à 09:38
salut

pour pouvoir utiliser la fonction AddressOf, il faut que ta fonction W soit dans un module .bas, ensuite, il faut que tu la passe à ta fonction X de la dll Z. Dans cette dll, tu dois déclarer un pointeur de fonction en convention stdcall puis tu affectes l'adresse à ton pointeur avec :
tafonctionW = adresse_fonction_W;

par contre, si tu veux un vrai code, il faudrait que tu donnes le prototype de ta fonction VB...

ShareVB
0
cs_doggyk Messages postés 21 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 12 mars 2005
13 déc. 2004 à 10:47
Salut!
Merci pour ta réponse mais j'avoue ne pas réussir à la mettre en oeuvre totalement car j'ai un message d'erreur sur les conversions long to int qui apparaît.
Plus précisément, voici un extrait des fonctions que j'utilise.
Si tu as 2 minutes pour me conseiller....
Merci d'avance!

Fichier principal VB:

Private Declare Sub numerisation Lib "numerisation.dll" (AdresseFonction As Long, seuil As Integer)

Private Sub Command1_Click()
numerisation AddressOf Analyse, 200
End Sub

Le module .bas:
Public function Analyse(x As Integer, y As Integer)
MsgBox "ok, ca marche! x=" & x & " y=" & y 'histoire de tester...
' .......
Analyse=1
End function

La partie importante de ma Dll:

extern "C" __declspec(dllexport) void numerisation(long& Adresse,int& seuil )
{
//.................
//long ( __stdcall *pFuncVb)(int* x,int* y);
//*(FARPROC *)&pFuncVb=Adresse;
//Je veux donc appeler Analyse en envoyant x=3 et y=5 par exemple et avoir le retour...
}
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
13 déc. 2004 à 12:41
salut

premier conseil : le plus de byval possible, comme ça pas besoin de pointeurs en C

deuxième conseil :
'int <=> long <=> As Long <=> 4 octets
'short <=> Integer <=> 2 octets

troisième conseil :
attention au valeur de retour, si on ne met rien VB ajoute As Variant et pas As Long

enfin, le code :

Private Declare Sub numerisation Lib "numerisation.dll" (byval AdresseFonction As Long,byval seuil As Long)

Private Sub Command1_Click()
numerisation AddressOf Analyse, 200&
End Sub

Le module .bas:
Public function Analyse(Byval x As Long,Byval y As Long) as long
MsgBox "ok, ca marche! x=" & x & " y=" & y 'histoire de tester...
' bon après faut voir si tu as besoin de modifier x et y dans cette function
Analyse=1
End function

// les noms ne sont-ils pas "décorés" par VC++ ? ou as tu un DEF...
extern "C" __declspec(dllexport) __stdcall void numerisation(void* Adresse,int seuil )
{
//.................
long ( __stdcall *pFuncVb)(int x,int y);
pFuncVb=Adresse; // je suis pas sur que ca compile

int ret = pFuncVb(3,5);
}

ShareVB
0
cs_doggyk Messages postés 21 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 12 mars 2005
15 déc. 2004 à 14:25
Re-salut!
J'arrive vraiment pas...
La partie VB fonctionne (suite aux conseils j'ai fais attention à mettre du long), l'appel à la DLL aussi (j'ai essayé sans le rappel) mais, le rappel...
Ca compile pas!
Dans chaque cas, j'ai un message(ou du même genre) sur la ligne A:

cannot convert from 'int' to 'int (__stdcall *)(int,int)'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

J'ai essayé les différentes méthodes:

//extern "C" __declspec(dllexport) void numerisation(int Adresse,int seuil ) //ou...
//extern "C" __declspec(dllexport) __stdcall void numerisation(int *Adresse,int seuil ) //ou...
extern "C" __declspec(dllexport) __stdcall void numerisation(int Adresse,int seuil )
{
int ( __stdcall *pFuncVb)(int x,int y);

//pFuncVb=Adresse; //A //ou...
//*(FARPROC *)&pFuncVb = Adresse; //A

int ret = pFuncVb(3,5);
}

Une idée ou conseil??...
A+.
Doggyk.
0

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

Posez votre question
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
15 déc. 2004 à 16:44
salut

typedef long __stdcall (*t_lpFuncVb)(int x,int y);

extern "C" __declspec(dllexport) __stdcall void numerisation(t_lpFuncVb lpAdresse,int seuil )
{
//.................

int ret = lpAdresse(3,5);
}

rien à changer dans VB
//compile sous dev-cpp

ShareVB
0
cs_doggyk Messages postés 21 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 12 mars 2005
17 déc. 2004 à 10:39
Salut!
C'est bon, ca compile mais maintenant VB ne trouve plus le point d'entrée de la dll... je pense que cela lui plait pas d'avoir une fonction qui est est de type t_lpFuncVb même si c'est du long...
Vois-tu la solution?
Je te remercie de ton aide.
Doggyk.
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
18 déc. 2004 à 12:21
salut

c'est ce que je pensais :
extern "C" __declspec(dllexport) fournit un nom décoré...
_numerisation@8 (je pense)

soit tu mets ce nom _numerisation@8 comme Alias de Declare

soit tu ajoutes un fichier DEF à ton projet VC++ dans lequel tu mets :

EXPORTS
numerisation @1

et pas besoin d'alias

ShareVB
0
Rejoignez-nous