Problème de passage d'argument VB/C++ dans une dll

EL0807 Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 18 mars 2006 - 15 mars 2006 à 22:11
EL0807 Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 18 mars 2006 - 18 mars 2006 à 10:34
Bonjour,
voici le code C++ de ma dll :


#include <windows.h>
#define export __declspec(dllexport)
export void SomeFunction(const LPCSTR sometext)
{
MessageBox(0, sometext , "DLL Message", MB_OK | MB_ICONINFORMATION);
}


j'appelle cette fonction dans VB avec le code suivant :


Private Declare Sub SomeFunction Lib "C:\Documents and Settings\...\sample.dll" (ByVal chaine As String)
Sub Test()
SomeFunction ("toto")
End Sub


L'opération s'effectue correctement, mais juste après survient un message d'erreur d'exécution 49 (convention d'appel de DLL incorrecte). Je crois que cela a avoir avec une sombre histoire de __stdcall, mais je ne sais pas quoi en faire (où le placer dans le code). Si je le mets après export ("#define export __stdcall __declspec(dllexport)"), alors plus rien ne marche (erreur 453 : la fonction est introuvable). Pareil si je le mets après "void" ("export void __stdcall SomeFunction(const LPCSTR sometext)").


Please Help!


PS : Vous avez compris que je suis un grand débutant! Si vous avez des références pour m'aider à comprendre ce que je fais, elles sont les bienvenues!

10 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 mars 2006 à 03:42
salut,

ajoute call devant ton appel pour voir? (ou enlève les parenthèses)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 mars 2006 à 10:28
#ifdef __cplusplus
extern "C" {
#endif

void __stdcall SomeFunction(const LPCSTR sometext)
{
MessageBox(GetFocus(), sometext , "DLL Message", MB_ICONINFORMATION);
}

#ifdef __cplusplus
}
#endif

L'appel VB va bon tel quel.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
EL0807 Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 18 mars 2006
17 mars 2006 à 16:01
Je réponds un peu tard, faute de connexion internet.
Déjà, merci pour votre aide.
Hélas, rien ne marche : call ne change rien, et la compilation du code proposé me renvoie une floppée d'erreur (syntax error before somtext, 'somtext' undeclared, ...)
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 mars 2006 à 16:03
bonne blague ....
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
17 mars 2006 à 17:00
Plein d'exemples de DLLs dans mes sources:

DLL C ET ASM POUR VB
http://www.cppfrance.com/code.aspx?id=20672
TRAITER STRING VB PAR DLL C/C++ (WIN32)
http://www.cppfrance.com/code.aspx?ID=30115

etc...

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
EL0807 Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 18 mars 2006
17 mars 2006 à 23:22
J'ai bien repris les conseils qui m'ont été donné, et me suis inspiré des exemples (qui marchent effectivement), mais mon code bute toujours sur l'erreur 49 :
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
void SomeFunction(const LPCSTR sometext)
{
MessageBox(0, sometext , "DLL Message", MB_OK | MB_ICONINFORMATION);
}
#ifdef __cplusplus
}
#endif
Pourquoi ce code provoque-t-il une erreur tandis que ceux aimablement proposés (ceux de TRAITER STRING VB PAR DLL C/C++ (WIN32)), fonctionnent correctement?
Je ne suis absolument pas informaticien, et les exemples de codes sans commentaires sont pour moi totalement abscons. Je n'ai pas la moindre idée de ce qui est important et de ce qui ne l'est pas, de ce qui peut provoquer cette erreur et de ce qui n'a rien à voir! Un peu de pitié pour un béotien!
Bien cordialement,
EL
0
EL0807 Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 18 mars 2006
17 mars 2006 à 23:44
J'oubliais de préciser que j'ai placé dans le dossier où se situe la dll (TestDLL.dll) un fichier TestDLL.def contenant ces lignes :
LIBRARY TestDLL
EXPORTS
SomeFunction @1
J'ai évidemment changé le nom de la dll dans le code VB.
Bien cordialement,
EL
0
EL0807 Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 18 mars 2006
18 mars 2006 à 00:02
Autre chose : j'utilise Code::Blocks pour compiler le code et créer la dll.
Bien cordialement,
EL
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 mars 2006 à 00:43
void __stdcall SomeFunction(const LPCSTR sometext)

Ne jamais oublier qu'il faut exporter en STDCALL.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
EL0807 Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 18 mars 2006
18 mars 2006 à 10:34
A nouveau merci pour le coup de main!
Le problème c'est que l'ajout de __stdcall provoque une erreur 453 (point d'entrée introuvable). Comme je commence à saisir deux trois trucs, j'ai eu la curiosité d'aller jeter un oeil sur la table d'exportation de la dll avec Quick View Plus 8.0. J'y observe alors que le nom de la fonction est devenu SomeFunction@4. Je modifie en conséquence le fichier .def, qui devient :
LIBRARY TestDLL
EXPORTS
SomeFunction SomeFunction@4


Et alors... erreur 453!


Je remodifie alors le .def en suivant des indications trouvées sur le net (http://www.laboratoire-microsoft.org/articles/dev/dll/4/) :
LIBRARY TestDLL
EXPORTS
SomeFunction = SomeFunction@4 PRIVATE


Et alors... erreur 453!


Je vais devenir fou...


Bien cordialement,


EL
0
Rejoignez-nous