Utiliser en vb++ une dll faite en c++

cs_jon26 Messages postés 11 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 1 mars 2004 - 21 févr. 2004 à 21:32
 guydegnol - 21 févr. 2006 à 03:36
Bonjour, je me casse la tête à tenter d'appeler une fonction de ma dll vc++ 6.0 en vb6.0.

Voici le code de ma fonction exemple dans la dll

extern "C" __declspec(dllexport) int essai4A(int *a, int *b)
{
int c=0;
int d=0;
a=&c;
b=&d;

for(int i=1;i<=49;i++)
{
for(int j=1;j<=50;j++)
{
for(int k=1;k<=51;k++)
{
for(int l=1;l<=52;l++)
{
for(int m=1;m<=52;m++)
{
c++;
}
}
}
}
}
return c;
}

Dans vb

je déclare

Public Declare Function essai4 Lib "ehsdll6.dll" Alias "essai4A" (ByVal a As Long, ByVal b As Long) As Long

et j'appelle

vc = essai4(a, b)

Lorsqu'il n'y à pas de paramètres ça marche, mais lorsque j'en mets, il me dit bad dll call convention. En c++ j'ai tenté

int essai4A(int *a, int *b)
int essai4A(int a, int b)

La déclaration des paramètres dans vb est-elle bonne?

Merci à celui qui résoudra cet affreux problème!!!

25 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 févr. 2004 à 21:46
Tes fonctions doivent etre exportees au standard: __stdcall

Fichier def:
LIBRARY bnMaths
EXPORTS
bnCompare @1
bnAdd @2
bnSub @3
bnMul @4
bnDiv @5

dans le cpp:
long __stdcall bnCompare(BSTR *bst1, BSTR *bst2)
{
...
}
ici je prends 2 String VB en param

etc...

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_jon26 Messages postés 11 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 1 mars 2004
22 févr. 2004 à 01:48
Merci beaucoup pour ta réponse, mais j'ai essayé et il me dit qu'il ne trouve pas le point d'entrée de la fonction dans le dll.

int __stdcall essai4A(int *a, int *b)

Ces fixhiers def, je les introduits comment dans mon projet?
Il faut créer quoi comme type de workspace pour faire ce genre de dll à utiliser dans vb, ou bien que faut-il changer dans les settings du projet?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 févr. 2004 à 02:01
New project
win32 DLL et VIDE !!! no headers precomp ou autres bidules.
Mets de suite en release.
Creer un cpp du meme nom que proj.
Aussi un fichier DEF meme nom que proj.

Tu mets ton DllMain dans cpp et le reste comme vu plus haut.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_jon26 Messages postés 11 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 1 mars 2004
22 févr. 2004 à 03:13
j'ai fait exactement comme tu as dit. Malgré tout, vb me dit que les conventions ne sont pas bonnes.
Tout ce que je veux, c'est passer deux entiers en paramètres. Je dois faire un pointeur (int *a), ou simplement le passage de l'entier (int a). De tte façon dans les deux cas, il refuse d'accepter ça comme un (a as long) en vb.

C'est fou que ce soit si dur de passer des parmètres, des simples entiers.

Merci en tout cas pour ton aide...
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 févr. 2004 à 12:08
Mais non ce n'est pas dur, je vois si j'ai un moment dans la journee et je fais une source de cela.
ciao...
BruNews, Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 févr. 2004 à 16:04
http://www.cppfrance.com/code.aspx?ID=20672
c'est fait.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_jon26 Messages postés 11 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 1 mars 2004
24 févr. 2004 à 00:16
Salut Brunews,

Merci pour ton aide et ce projet que tu as fait. Le fichier sln crée une erreur et m'ouvre Microsoft Visual Developper. J'aurais aimé avoir le tout dans Microsoft VC++, mais c'est déjà très chouette. J'ai pu voir chacun de tes fichiers séparément, et j'ai essayé de reporter ce que tu as fait sur mon code, et même de compiler ta dll et appeler tes fonctions depuis mon code vb.

Les mêmes erreurs se produisent. Alors, ce que j'ai fait, c'est mettre dans un .zip un projet complet vc++ avec ma fonction exportée selon deux méthode (export, et stdcall) et le code vb qui l'appelle.

Lorsque j'appelle la fonctione xportée avec "extern "C" __declspec(dllexport)", l'erreur dans vb est "Bad dll calling convention"

Lorsque j'appelle la fonctione exportée avec "__stdcall", l'erreur dans vb est "Can't find dll entry point"

Peux-tu jeter un oeil à mon zip qui est très simple. je dois oublier un bête truc qui me prend déjà une semaine. C'est pas logique tout ça. Avec ton expérience, tu verras le probkème directement. Voici mon .zip :

http://www.cppfrance.com/code.aspx?ID=20711

Merci infiniment

Jonathan
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 févr. 2004 à 00:44
J'ai pris ton zip et enleve ta source.

C'est quoi tout ce bordel d'include qu'il y a en haut du cpp ???
Je reprends ce qu j'avais mis plus haut:

New project
win32 DLL et VIDE !!! no headers precomp ou autres bidules.
ME SEMBLE POURTANT TRES CLAIR, non ? Et pourtant 1ere chose que je trouve, stdafx... c'est pas venu tout seul.
VIDE, VIDE !!!
Y a pourtant des options quand tu fais un new proj, faut pas tout ce qu'il y a par defaut.

Ou est le fichier DEF pour export des fonctions SANS decoration des noms de fonction ???

Creer un cpp du meme nom que proj.
Aussi un fichier DEF meme nom que proj.
2 lignes qui etaient SANS ambiguite.

Recommence en faisant EXACT ce que j'ai dit.
CPP ne doit avoir que <windows.h> en include !!!

long __stdcall essai4B(long a, long b)
Celle ci est la bonne, manque seulement que son nom soit en export dans un DEF.

Une derniere: ne pas se servir des sources comme d'un FTP, ouvre t'en un sur FREE ou autre, c'est gratos.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_jon26 Messages postés 11 Date d'inscription mercredi 21 mai 2003 Statut Membre Dernière intervention 1 mars 2004
25 févr. 2004 à 18:15
Salut, tout d'abord merci beaucoup pour le temps que tu as passé à m'expliquer tout ça. Je viens de comprendre mon imbécilité. J'ai bêtement copié ton fichier def sans réfléchir, ce sont des noms de fonction. Nom d'une pipe, mais alors, ça va marcher!!! Je dois mettre le nom de mes fonctions et pas des tiennes... Faut dire qu'on voyait pas tout de suite que c'étaient des noms de fonctions ;) Bon j'essaye de remettre un peu de faute sur toi, mais elle ne vient que de moi la faute.
A propos du projet pas vide, je sais bien, j'avais fait à la lettre ce que tu m'avais dit, mais ça ne marchait pas, alors j'ai fait un nouveau projet avec du défaut pour réessayer, et désespéré je t'ai envoyé celui-là, dans la tourmente.

Tu es génial, tes infos étaient suffisantes, et moi pas assez attentif ;) Merci beaucoup

P.S. pour les sources, bien compris, je ne le ferai plus
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
28 avril 2004 à 10:41
'jour tout le monde,

Moi aussi je suis en train de créer une DLL visible sous VB.
Pour toutes les choses décrites dans ce topic, je n'ai pas de problème. Cependant j'ai quelques question qui touchent à ce même sujet.

Est-il possible de faire une classe dans la DLL C qui puisse être récupérer sous VB ? (lorsque l'on fait une DLL sous VB on peut intégrer autant de classes qu'on veut, les rendre visible ou non pour l'appli client) .
J'ai entendu dire que les DLL créées par VB sont des DLL ActiveX, dois-je (et puis-je) créer un tel fichier avec VC6 ?

Est-il possible de créer une DLL en C qui puisse être directement liée à un projet VB avec la commande
"Projet > Références ..." ?

voila, j'espère avoir une réponse de BruNews qui a quand même l'air d'être un grand spécialiste.

merci d'avance
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 avril 2004 à 11:17
Bien entendu qu'avec VC++ on peut creer de l'ActiveX et tout ce qui est win32 en general.
Je suis radicalement contre ActiveX, quel interet ?
Si on fait une dll C pour VB c'est pour speeder VB alors nenni interfaces COM et toutes autres lourdeurs, VITESSE !!!
Un ActiveX doit etre enregistre pour avoir Proj->References. T'en as pas marre des ennuis d'install de VB dus a cela ? Une dll C pure API se pose dans dossier de exe et tout va bon, pas de conflit de version etc...

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
28 avril 2004 à 11:36
Merci pour cette réponse rapide BruNews.

En effet si la perte de vitesse en AciveX est importante, ce n'est pas la bonne solution. En effet j'ai décidé d'utiliser une DLL C pour des questions de performances (certains calculs ont pris plusieurs jours codés en VB).

Toutefois j'avais un modèle objet très complet et j'aurais aimé le gardé plutot que passer en fonctionnel. De plus les classes me permettaient de sécuriser l'accès aux données, ce que les structures ne font pas.

Mais, en gros, ton conseil c'est de faire toute ma DLL en procédural. Il faudra donc que je crée un module VB avec bien sûr tout les Declare mais aussi la "re-"définition des structures.

Bon, ben comme au bon vieux temps lol

Merci encore BruNews
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
11 nov. 2004 à 22:38
Bonjour a tous.

j'ai crée une librairie .h que je converti en DLL.

la DLL fonctionne pour le VC++.

je l'ai modifiée en suivant les instructions de BruNews

mais losque je compil j ai un warning:

Linking...
Creating library Debug/reglin1.lib and object Debug/reglin1.exp
reglin1.exp : warning LNK4070: /OUT:reglin.dll directive in .EXP differs from output filename "Debug/reglin1.dll"; ignoring directive

et quand j'utilise la DLL dans VB6 j'ai l'erreur:

machin ne peut pas etre read.

je sais pas quoi faire je trouve pas mon erreur..

Lemagicien
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2004 à 22:50
D'abord prends l'habitude de toujours bosser en RELEASE et non debug.
C'est quoi une 'librairie .h' ??? du code a passer en dll doit se trouver dans un .c ou .cpp pour qu'il y ait qlqchose a compiler.

ciao...
BruNews, MVP VC++
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
12 nov. 2004 à 19:06
Oui je sais cela, j ai simplement adapté ma librairie .h donc copier le contenu du .cpp dans le projet.

bref ca pose pas de probleme a la compilation de la DLL
mais bien lors de son utilisation
Lemagicien
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2004 à 19:13
alors compile en mode C, prototype tes funcs a exporter en __stdcall et mets leur nom dans un fichier DEF, ensuite doit aller.

ciao...
BruNews, MVP VC++
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
12 nov. 2004 à 19:39
Voici le fichier .def

LIBRARY reglin
EXPORTS
pente @1
ordonnee @2
corr @3

et le .cpp

/******************************************************/
/* Fonctions pour le calcul de la régression linéaire */
/* par la méthode des moindres carré */
/******************************************************/

/* Fonction de clacul de la pente (a) */

double __stdcall pente(double Xi[],double Yi[],int n)
{
double a;

a = covariance(Xi,Yi,n)/variance(Xi,n);

return (a);
}

/* Fonction de clacul de l'ordonnée a l'origine (b) */

double __stdcall ordonnee(double Xi[],double Yi[],int n)
{
double b;

b = moyenne(Yi,n) - ( pente(Xi,Yi,n) * moyenne(Xi,n) );

return (b);
}

/* Fonction de calcul du coef de corrélation (r) */

double __stdcall corr(double Xi[],double Yi[],int n)
{
double r;

r = covariance(Xi,Yi,n)/( ecarttype(Xi,n) * ecarttype(Yi,n) );

return (r);
}

toujours la meme erreur
Lemagicien
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2004 à 19:50
et c'est quoi exactement l'erreur (s).

ciao...
BruNews, MVP VC++
0
cs_lemagicien Messages postés 95 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 10 novembre 2004
13 nov. 2004 à 01:35
La memoire ne peut pas etre read

Lemagicien
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 nov. 2004 à 13:49
Si ta dll va bon avec un prog de test en C alors sera que tu passes mal les params depuis VB ou mauvaises declarations des fonctions dans VB.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous