Appeler une fonction VB à partir de C++

Signaler
Messages postés
21
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
12 mars 2005
-
Messages postés
21
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
12 mars 2005
-
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.

5 réponses

Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Aucune idée, à mon avis le forum VB serait plus approprié pour cette question. Sinon vu son nom AdressOf devrait convenir, mais je ne garantis rien...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
long (__stdcall *pFuncVb)(int*, int*);
*(FARPROC *)&pFuncVb = addressOfVb;

ceci pour une func VB genre:
MaFunc(a As Long, b As Long) As Long
avec les 2 params ByRef comme d'hab en VB.

ciao...
BruNews, MVP VC++
Messages postés
21
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
12 mars 2005

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...
}
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
bouhhh pour moi, comme d'hab j'ai repondu un peu vite en faisant autre chose.

long (__stdcall *pFuncVb)(int, int);
*(FARPROC *)&pFuncVb = addressOfVb;
les
params par valeur et NON des pointeurs. Si tu as besoin de pointeurs c'est possible aussi.

Les params chez VB pour une callback ou en appel d'une func DLL ne doivent jamais etre 'As Integer' car fait 16 bits, emploie toujours du 'Long' VB.

ciao...
BruNews, MVP VC++
Messages postés
21
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
12 mars 2005

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.