IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Dll VC++ utilisable en VB6


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Points : 58
    Points
    58
    Par défaut Dll VC++ utilisable en VB6
    Bonjour à tous

    J'ai enfin trouvé mon bonheur depuis 3 jours que je cherche .

    Comme je suis un embrion de débutant, je vais prendre exemple sur ce genial code pour creer une DLL utilisable en VB.
    Seulement voila, l'auteur a quelques doutes sur son propre code, et il demande plusieurs fois confirmation.

    J'aurais voulu savoir si quelqu'un d'entre vous pouvait jeter un oeil sur son joli travail et me dire si il faut corriger quelques lignes ou si on peut y aller les yeux fermés.
    JE me chargerais à mon tour de lui envoyer un mail de remerciement ainsi que le lien de son code corrigé.

    Je vous remercie beaucoup de votre comprehension.
    Et vous souhaite une excelente journée
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Pour créer une DLL C++ utilisable depuis à peu près n'importe quel langage de programmation (VB inclus), il faut fournir une interface C et non C++ des fonctions exportées et utiliser la convention d'appel standard (stdcall), car c'est celle qui est la plus supportée par la plupart des langages. Ensuite si tu utilises Visual C++ tu dois exporter tes fonctions à l'aide d'un fichier DEF et non à l'aide de __declspec(dllexport) pour que le compilateur n'applique pas de décoration de nom (Visual C++ décore le nom des fonctions stdcall). Donc pour être "portable" utilise un fichier DEF quel que soit ton compilateur.

    Pour fournir une interface C d'une fonction C++ il suffit de faire précéder sa déclaration par extern "C".

    Voici donc un exemple de fichier source CPP (mydll.cpp) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    extern "C" int __stdcall f(void);
     
    int __stdcall f(void)
    {
        return 0;
    }
    Et le fichier DEF (mydll.def) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LIBRARY mydll
    EXPORTS f

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup MELEM pour ton explication, claire et precise

    En tout cas, ce n'est pas pour faire du leche botte, mais je viens de commencer le C, et j'ai donc essayé plusieurs forums en meme temps, y'a pas photo, c'est celui ci le meilleur, non seulement au niveau technique et simplicité d'utilisation, mais surtout par votre l'acceuil et la rapidité de vos réponses.

    Excusez moi encore, et merci de votre précieuse aide

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    J'ai lu seulement le cpp car je n'ai pas VB .

    - Pour les questions dans DllMain :
    * dwReason = DLL_PROCESS_ATTACH lorsqu'un processus demande le chargement de la DLL
    * dwReason = DLL_PROCESS_DETACH lorsqu'un processus demande le déchargement de la DLL (libère la DLL)
    * dwReason = DLL_THREAD_ATTACH lorsqu'un thread demande le chargement de la DLL
    * dwReason = DLL_THREAD_DETACH lorsqu'un thread demande le déchargement de la DLL
    Un processus = un exe. Un thread est un "sous exe" dans un exe (crée par ce dernier, mais un thread n'est pas un exe). Un processus peut lancer plusieurs threads en même temps (à l'aide de CreateThread par exemple).

    - En ce qui concerne les chaînes de caractères, en fait les paramètres en VB, chaînes ou pas, sont par défaut passés par référence (ByRef). Il faut expliciter l'option ByVal pour passer un paramètre par copie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int _stdcall msgbox2(char **buffer)
    {
        MessageBox(NULL, *buffer, "DLL!!!", 0);
        return 0;
    }
     
    int _stdcall msgbox3(char *buffer) 
    {
        MessageBox(NULL, buffer, "DLL!!!", 0);
        return 0;
    }
    Seule la deuxième (msgbox3) me semble correcte car la première attend l'adresse d'un char * (char * = chaîne de caractères) c'est-à-dire une chaîne passée par référence tandis que le deuxième nécessite une chaîne passée par valeur (par copie). Lorsqu'une chaîne est passée par copie [VB], le caractère de fin de chaîne '\0' (requis en C) est automatiquement ajoutée. Pour l'utiliser c'est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function MsgBox3 Lib "dllvb" Alias  "msgbox3" (ByVal message As String) As Integer
    Pour utiliser msgbox2 il faut mettre ByRef à la place de ByVal (ou ne rien mettre) mais comme je l'ai déjà dit, cette fonction craint.

    - A propos des paramètres :
    //REM: je pense (mais j'en suis pas sûr) que un char buffer[] = char *buffer.
    //Si quelqu'un pouvais me le confirmer par un commentaire ce serait bien.
    Oui, en paramètre d'une fonction, char * buffer = char buffer[].

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ces histoires de char*, ça me parait toujours bizarre, parce qu'il me semble qu'à la base VB utilise des chaînes unicodes.

    Le type de chaîne qui est garanti être toujours compatible avec VB, c'est un type Windows appelé BSTR...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Oui, mais quand on passe une chaîne en paramètre d'une fonction, VB passe en fait l'adresse du premier caractère de la chaîne. Si cette adresse est récupérée par un String, un String sera crée à partir de ces caractères. De plus, si les caractères sont tous ANSI, VB convertit les caractères en caractères ANSI. C'est pour cela qu'on utilise les versions ANSI des APIs de Windows dans du code VB lorsque les caractères le sont.

  7. #7
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Hum, cette page est plutôt intéressante faut le dire. D'après ce qu'elle raconte il faut utiliser Byte à la place de String si on veut passer une chaîne Unicode à une fonction car si on met String, la chaîne sera toujours convertie en ANSI. Et c'est pas tout mais le reste est expliqué dans la page .

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ah, OK: Si je comprends bien, VB ne passe directement des BSTR que dans le cadre d'un objet COM.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Points : 58
    Points
    58
    Par défaut
    Je vous remercie beaucoup de votre aide.
    Et particulierement MELEM pour ses explications à chaque fois précises à la maniere d'un professeur

    Me voila rassuré pour ce code
    Je vais mettre à partie ses precieuses corrections que tu m'a dictées.

    Je vais en profiter pour donner le lien à l'auteur, cela peut, peut-etre, lui etre utile, puisqu'il a demandé de l'aide

    Mille mercis

  10. #10
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Médinoc
    Ah, OK: Si je comprends bien, VB ne passe directement des BSTR que dans le cadre d'un objet COM.
    C'est ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'une DLL tierce - Dev-cpp + VB6
    Par vihrea dans le forum Dev-C++
    Réponses: 0
    Dernier message: 08/02/2010, 17h23
  2. [dll] libérer une dll apres utilisation
    Par polo54 dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 11/07/2009, 22h48
  3. Réponses: 7
    Dernier message: 13/01/2005, 10h30
  4. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18
  5. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo