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

MFC Discussion :

interfacer C++ et VB [FAQ]


Sujet :

MFC

  1. #1
    Membre actif
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Par défaut interfacer C++ et VB
    Je suis confronté au problème suivant:
    on va me fournir une DLL codée en VC++. Je dois l'interfacer avec du VB. Puisque cette DLL est un composant Win32, VB devrait pouvoir accéder aux méthodes de la DLL. Mais il doit y avoir des types de données inconnus de l'un ou l'autre de ces deux langages.
    J'ai besoin de connaitre les types de donnée à utiliser pour interfacer les 2 composants.

    Question: quels sont les types de données communs à VC++ et à VB ?

    Merci de vos réponses.

  2. #2
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Par défaut
    Tu peux effectivement utiliser une DLL développé avec VC++ dans Visual Basic.

    Pour se faire, il faut que les fonctions que tu vas utiliser soit exporter dans la DLL. Il faut aussi qu'on te fournisse le fichier LIB généré en même temps que la DLL.

    Ensuite, dans VB, tu vas devoir déclarer que tu utilises une fonction qui provient de ta librairie.

    Ensuite pour les types de données, tu dois utiliser les types de données de VB, mais je ne sais pas trop si ca pose problème.

    J'ai déjà eu des plantages en utilisant la DLL kernell32.dll. En fait, pour les chaines, il faut que tu les remplisses avant d'appeler ta DLL.

    Par exemple, si un paramètre de ta fonction de ta DLL est de type char szChaine[256], il faut que tu remplisses ta chaine de 256 caractères NULL (vbNullChar).

  3. #3
    Membre actif
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Par défaut
    Merci pour ta réponse.

    Tu dis:
    il faut que les fonctions que tu vas utiliser soit exporter dans la DLL
    Je pense que tu veux dire que : il faut que les fonctions dont j'ai besoin soient fournies par la DLL, non ?

    Tu parles du fichier LIB. Je ne peux pas attaquer la DLL directement ? A quoi me sert ce fichier LIB ?

  4. #4
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Par défaut
    En fait, tu peux avoir plein de fonction dans ta DLL, mais si elles ne sont pas exportées, elles ne pourront être appelées de l'extérieur.

    Pour vérifier ce point, il suffit de cliquer avec le bouton droit sur ta DLL, et faire 'View Depency' ou l'ouvrir avec Dependency Walker. Si la fonction que tu veux utiliser, est dans le tableau des dépendances, c'est OK, cela fonctionnera.

    Pour le fichier LIB, je crois qu'il faut l'avoir pour utiliser ta DLL depuis VB.

  5. #5
    Membre actif
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Par défaut
    oui, il me semble avoir déjà référencer des LIB dans des projets VB 6.0.
    Si je comprends bien, "exporter" une méthode revient à en rendre l'accès Public, non ?

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut Exactement
    Exactement, exporter une fonction revient a peu près aux fonctions publique en C++.

    Sachant que pour les soucis de variable et de type de données la personne en question peu avoir aussi exporter des TYPES cad des classes qu'il aurais lui meme crée et dans ce cas précis il doit avoir laisser accès a ces classe pour que tu puisse créer les objet approprié.

    voila

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut Re: interfacer C++ et VB
    Citation Envoyé par Yann
    Je suis confronté au problème suivant:
    on va me fournir une DLL codée en VC++.
    Pour information, si tu utilises les versions .NET de ces langages, il est possible de créer une interconnection bien plus forte (je me suis amusé à dériver en C++ managé d'une classe écrite en VB et réciproquement).

    Suivant le type de code à interfacer, ça peut alors simplifier les choses de faire une interface DLL en C++ -> assembly en C++ managé
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre actif
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Par défaut
    oui, je suis au courant. Mais ce n'est pas moi qui développe le composant C++: il est développé par une autre société. Le framework .NET ne hélas fait pas partie de l'environnement du système.

  9. #9
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    tous les types de bases sont passable :
    Un résumé provenant de l'aide de VC++ et VB

    EN VB :

    Byte 1 byte 0 to 255
    Boolean 2 bytes True or False
    Integer 2 bytes -32,768 to 32,767
    Long (long integer) 4 bytes -2,147,483,648 to 2,147,483,647
    Single(single-precision floating-point) 4 bytes
    Double (double-precision floating-point) 8 bytes

    EN C++ :

    Type Size
    char, unsigned char, signed char 1 byte
    short, unsigned short 2 bytes
    int, unsigned int 4 bytes
    long, unsigned long 4 bytes
    float 4 bytes
    double 8 bytes
    long double1 8 bytes


    Conclusion :
    C++ | VB
    char == byte
    bool == Boolean
    short== Integer
    int == Long
    long ???Long ou rien
    float == Single
    double ==Double

    On peut même passer un pointeur, en effet une adresse mémoire étant stockée sur 4 BYTES si mes souvenirs sont bons, tu peut déclarer en C++ un pointeur de ce que tu veus et en VB tu le récupere comme ByRef Long.

    un exemple tu peut par example manipuler les fonctin BMP du GDI
    j'avais trouvé ça sur internet
    sachant que "&H" en VB correspond à "0x"

    La structure BITMAP correspond à Un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    '**********BITMAP****************
    Public Const SRCCOPY = &HCC0020
    Public Const DIB_RGB_COLORS = 0
     
     
    Public Type BITMAP
        biSize As Long
        biWidth As Long
        biHeight As Long
        biPlanes As Integer
        biBitCount As Integer
        biCompression As Long
        biSizeImage As Long
        biXPelsPerMeter As Long
        biYPelsPerMeter As Long
        biClrUsed As Long
        biClrImportant As Long
    End Type
    '**********WAPI****************
    Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
    Public Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Public Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Sachant que la structure VB BITMAP correspond à ceci en C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    typedef struct tagBITMAPINFOHEADER{ // bmih 
        DWORD  biSize; 
        LONG   biWidth; 
        LONG   biHeight; 
        WORD   biPlanes; 
        WORD   biBitCount 
        DWORD  biCompression; 
        DWORD  biSizeImage; 
        LONG   biXPelsPerMeter; 
        LONG   biYPelsPerMeter; 
        DWORD  biClrUsed; 
        DWORD  biClrImportant; 
    } BITMAPINFOHEADER;
    ReConclusion : si tu fais une DLL avec une Classe, VB peut manipuler un pointeurs sur un objet de cette classe et le passer à des fonctions globales de ta DLL.
    Par contre il n'existe pas à ma connaissance de moyen d'exporter un Objet C++ avec ces méthodes afin que VB puisse les appeler.

    Voilou, j'èspere que j'ai pas répondus hors-sujet et que ça peut taider.

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    pour l'objet avec ses methodes pourquoi pas un activex.

  11. #11
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Pour completer la réponse de matazz.
    Pas besoin d'avoir un .lib.

    Le .dll suffit. Par contre il faut connaitre les fonctions exportées de la DLL ainsi que leur signature pour pouvoir les déclarer en VB avec l'instruction Declare.
    Si tu peux avoir les fichiers d'include .h de la DLL C cela peut t'aider.

    Sinon voici un bon site qui traite de VB et des appels Win32 http://vbnet.mvps.org/index.html

  12. #12
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    effectivement c'est l'interet des ActivesX...
    salut,
    pour l'objet avec ses methodes pourquoi pas un activex.
    par contre ce qui est lourd avec les activeX c'est la maintenance des versions, mais bon c'est un autre problème...

  13. #13
    Membre actif
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Par défaut
    Merci pour vos réponses

    J'ai eu une partie de specs techniques de ce composant C++.
    La DLL C++ qui va m'être fournie définit des types "métier" qui sont utilisés dans les signatures de certaines de ses méthodes. Le problème est donc plus large qu'une correspondance de type de base.
    Le plus simple serait sans doute d'avoir un second composant C++ qui encapsule cette DLL. Ce composant pourrait être un ActiveX qui accepterait en entrée de types de base manipulables par VB. Les types "métier" ne sortiraient pas du périmètre de cet ActiveX: ils seraient connus de ce composant uniquement. On pourrait procéder à une espèce de mapping de types objet.

    Cela vous semble-t-il cohérent ?

  14. #14
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    pour moi oui !

  15. #15
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Citation Envoyé par farscape
    pour moi oui !
    pour moi aussi, et j'ai déjà fait un truc du genre

  16. #16
    Membre actif
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2002
    Messages : 54
    Par défaut
    et tant qu'on y est , on en profite pour en faire un composant COM+ multithread afin de permettre les appels depuis des sites distants ! 8)

  17. #17
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Par défaut
    Bonjour,

    Votre thread m'a beaucoup aide (encore merci) et j'ai realise un wrapper traditionnel de mes classes c++ pour VB en passant en parametre l'adresse de l'ojbect et ca marche tres bien. Mais en fait j'utilise .NET pour VB et C++ donc si je comprend bien je pourrais utiliser des interfaces manages pour interconnecte mes classes. Le probleme c'est que je connais assez bien VC++ mais je suis debutant en .NET. Donc si vous aviez quelques liens utile concernant particulierement l'interconnection de class via le framework .NEt, ca serait genial. Je me ballade sur les MSDN je tourne autour mais je vois pas vraiment comment pratiquement je peux faire ca. Et surtout l'aventage que j'aurais a le faire.

    Merci d'avance

    Merci

    Ecuyer.

Discussions similaires

  1. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  2. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  3. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27
  4. [VB6] [Interface] Tester le Type de Controle
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/09/2002, 09h51
  5. [VB6] [Interface] Icones de boutons de barre d'outils
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 13/09/2002, 15h50

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