psychospire
Messages postés42Date d'inscriptionmercredi 8 novembre 2006StatutMembreDernière intervention 9 décembre 2008
-
11 mai 2008 à 21:15
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
12 mai 2008 à 11:40
Bonjour à tous, je vous expose mon problème.
J'essaye de créer une dll en c++ qui sera appelée à partir d'un programme en vb.
Le truc, c'est que j'aimerais appeler à partir de vb une des fonctions de la dll qui elle meme appellera une autre fonction de cette dll.
psychospire
Messages postés42Date d'inscriptionmercredi 8 novembre 2006StatutMembreDernière intervention 9 décembre 20081 11 mai 2008 à 22:10
Effectivement ca marche, c'était tout simple en fait lol merci à toi.
En fait, je demandais ca car j'ai un problème un peu plus compliqué :
Dans ma fonction 1, j'ai une fonction 3 qui prend pour paramètre la fonction 2 :
Cette fonction3 est appelée à partir d'une bibliothèque extérieure et j'ai pas moyen de savoir comment elle marche (je pense qu'elle utilise des pointeurs).
Bref, quand j'appelle la fonction 1 à partir de vb, ce dernier me dit :
Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 11 mai 2008 à 23:03
Le prototype inclut le type de retour, le nom de la fonction, ses paramètres et autres petites choses (comme les conventions d'appel par exemple) si il y a lieu.
__declspec(dllexport) void Fonction1();
Ceci est le prototype de Fonction1.
Quel est celui de Fonction3 ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 mai 2008 à 23:11
La convention d'appel doit être réglée direct au niveau du compilo pour ne pas faire d'erreurs (oubli de préciser ou autre), surtout si cette dll sera exploitée par différents langages.
32 bits : __stdcall
64 bits : __fastcall
La dll sera ainsi au standard de l'API Windows.
psychospire
Messages postés42Date d'inscriptionmercredi 8 novembre 2006StatutMembreDernière intervention 9 décembre 20081 11 mai 2008 à 23:23
-> Sakingdom : je ne connais rien de cette fonction, c'est ce qui est un peu embetant...
-> Brunews : je dois rajouter __stdcall à chaque fonction de ma dll ou seulement à celles que j'exporte?
Je l'ai ajouté à la fonction1 (celle que j'exporte) et mon erreur à changé : il me dit maintenant qu'il n'arrive pas à trouver le point d'entrée de ma fonction 1.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 mai 2008 à 23:33
Si tu ne règlers pas au niveau du compilo alors tu mets __stdcall à toutes, c'est une bonne habitude à prendre.
Tu devrais aussi compiler en mode C pour être certain de ne pas avoir de décoration sur les noms de fonction, le mieux restant d'exporter par un fichier DEF.
psychospire
Messages postés42Date d'inscriptionmercredi 8 novembre 2006StatutMembreDernière intervention 9 décembre 20081 12 mai 2008 à 10:42
Bon, ça marche pas vraiment avec __stdcall,. En effet, si je met ça :
__declspec(dllexport) int __stdcall Fonction 1()
{
return 1;
}
et que j'appelle la fonction 1 dans vb, il me dit qu'il n'arrive pas à trouver le point d'entrée de cette fonction. Comment faire?
psychospire
Messages postés42Date d'inscriptionmercredi 8 novembre 2006StatutMembreDernière intervention 9 décembre 20081 12 mai 2008 à 11:26
Bon, je ne vois vraiment pas d'ou peut venir le problème... j'ai fais le fichier DEF comme ca :
LIBRARY "MaDll.dll"
EXPORTS
Function1 [mailto:_Function1@0 _Function1@0]
j'ai ma dll :
extern "c"
{
int __stdcall Function1
{
return 1;
}
}
et j'appelle ma fonction1 dans vb comme ca :
Private
Declare
Function Function1
Lib
"MaDll.dll" ()
As
Integer