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

VC++ .NET Discussion :

Appeler dll VB depuis VC++


Sujet :

VC++ .NET

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut Appeler dll VB depuis VC++
    Bonjour à tous,

    j'essaie depuis quelques jours d'appeler une dll VB en C++, à l'aide de visual studio 2008. Il se trouve que je rencontres quelques erreurs... Voici la démarche que j'ai mis en place.

    Les tuto sur VS ( versions précédentes) conseillaient de faire une dll activeX.

    Pour simuler, j'ai codé la dll suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Class Class1
        Public Function MyVBFunction(ByVal x As Integer) As Integer
            MsgBox(x)
        End Function
     
    End Class
    J'ai rajouté les options visible depuis COM, lié avec une clef SN, et j'ai finalement utilisé l'outil OLE-COM Viewer pour voir le .idl de la dll.

    Une fois avec le .idl, je l'ai compilé en l'insérant dans un projet C++ et je me suis retrouvé avec le fichier .h et .c. Jusque la, je me sentais relativement trop fort...

    Souci, le client suivant
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
                 //le fichier .h est inclus ici
    	HRESULT		hr;
    	_Class1	*IVBTestClass = NULL;
     
    	int sh=2;
    	// Now we will intilize COM
    	hr = CoInitialize(0);
    	// Use the SUCCEEDED macro and see if we can get a pointer 
    	// to the interface
    	if(SUCCEEDED(hr))
    	{
    		hr = CoCreateInstance( CLSID_Class1,
    					NULL,
    					CLSCTX_INPROC_SERVER,
    					IID__Class1, 
    					(void**) &IVBTestClass);
     
    			if(SUCCEEDED(hr))
    		             {
    			long			ReturnValue=42;
    			// We can test this HR as well if we wanted to
    				IVBTestClass->MyVBFunction(sh);
     
     
    			// We can test this HR as well if we wanted to
    			hr = IVBTestClass->Release();
     
    		}
    		else
    		{
    			// Something went wrong
    			cout << "CoCreateInstance Failed." << endl;
    		}
     
    	}
    	// Uninitialize COM
    	getchar();
    	CoUninitialize();
    Au début, le prog me disait que la fonction MyVBFunction n'était pas un membre de la classe Class1. Alors, j'ai regardé le .idl et j'ai vu qu'en effet, la classe ne comportait ni attribut ni méthodes.

    Ne sachant pas trop quoi faire, j'ai moi meme rajouté la signature de la méthode au .idl, ce qui a forcément rajouté la signature dans le .h et la plus d'erreur de compilation. A l'éxecution, évidemment, ca marche pas (l'appel de la fonction VB soulève une exception que je ne sais pas identifier).

    Sachant que tout ceci présente beaucoup d'étapes, je me suis dit qu'il y avait sans doutes un endroit ou j'ai utilisé une méthode fausse.

    Quelqu'un aurait des suggestions ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Puis-je voir le fichier idl?
    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.

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    Bien sûr ! C'est le fichier idl généré, j'ai enlevé la signature de fonction que j'avais rajouté puisqu'apparemment c'est mal.
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    // Generated .IDL file (by the OLE/COM Object Viewer)
    // 
    // typelib filename: Secondll.tlb
     
    [
      uuid(3BB89CE7-61F7-472F-8577-49D6071259F0),
      version(1.0),
      custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "Secondll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=60d3d66cbb07cdef")
     
    ]
    library Secondll
    {
        // TLib :     // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}
        importlib("mscorlib.tlb");
        // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
        importlib("Stdole2.tlb");
     
        // Forward declare all types defined in this typelib
        interface _Class1;
     
        [
          uuid(0426D1E2-82F6-3183-AEEF-00F3ACB86D2E),
          version(1.0),
          custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "Secondll.Class1")
        ]
        coclass Class1 {
            [default] interface _Class1;
            interface _Object;
        };
     
        [
          odl,
          uuid(6F686E08-E135-3E94-944E-0A22EA800831),
          hidden,
          dual,
          oleautomation,
          custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "Secondll.Class1")    
     
        ]
        interface _Class1 : IDispatch {
     
        };
    };

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le problème, c'est que j'avais envie de voir la signature de fonction que tu avais rajouté.

    En fait, elle devrait avoir une signature un peu de ce type:
    Code IDL : Sélectionner tout - Visualiser dans une fenêtre à part
    HRESULT MyVBFunction([in] int x, [out, retval] int * ret);
    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.

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    Je te remercie de tes réponses, mais j'ai l'impression de pas avoir été très clair. Je me demandes si c'est naturel de devoir rajouter à la main la signature de la fonction MyVBFunction, elle devrait pas apparaître automatiquement ?

    Parce que si j'ai enlevé la signature de la fonction, c'est que je l'ai rajouté à la main, en désespoir de cause (après avoir remarqué son absence dans le fichier .idl qui impliquait son absence dans le .h généré et donc l'erreur de compilation). Je me demandes en fait s'il faut pas rajouter des options de compilation dans Visual Studio ou je ne sais quoi d'autre pour que les signatures de fonctions marquées public dans la dll apparaissent automatiquement dans le .idl ..?


    En attendant peut être un éclaircissement sur la question, je vais tenter de rajouter à la main la signature de la fonction que tu m'as donné. Elle est carrément différente de ce que je faisais moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HRESULT MyVBFunction([in] int x);
    Merci pour avoir pris du temps pour répondre en tout cas ;-)


    PS : petite précision sur ce qui se passe à l'exécution (après avoir modifié le .idl pour suivre la signature que tu proposais) :

    usedll.exe has triggered a breakpoint. Ce breakpoint pointe sur la ligne d'appel à la fonction VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IVBTestClass->MyVBFunction(sh, &ReturnValue);

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par jdesert Voir le message
    Je te remercie de tes réponses, mais j'ai l'impression de pas avoir été très clair. Je me demandes si c'est naturel de devoir rajouter à la main la signature de la fonction MyVBFunction, elle devrait pas apparaître automatiquement ?
    Si. Mais je voulais surtout voir si tu avais ajouté une mauvaise définition dans l'IDL.
    Parce que si j'ai enlevé la signature de la fonction, c'est que je l'ai rajouté à la main, en désespoir de cause (après avoir remarqué son absence dans le fichier .idl qui impliquait son absence dans le .h généré et donc l'erreur de compilation). Je me demandes en fait s'il faut pas rajouter des options de compilation dans Visual Studio ou je ne sais quoi d'autre pour que les signatures de fonctions marquées public dans la dll apparaissent automatiquement dans le .idl ..?
    Malheureusement, je n'ai aucune idée de ces options, car je n'utilise jamais VB.Net, je fais du C# à la place.
    Par contre, il doit bel et bien manquer quelque chose, notamment les attributs (Guid, ComVisible, etc.) pour la classe.

    En attendant peut être un éclaircissement sur la question, je vais tenter de rajouter à la main la signature de la fonction que tu m'as donné. Elle est carrément différente de ce que je faisais moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HRESULT MyVBFunction([in] int x);
    Merci pour avoir pris du temps pour répondre en tout cas ;-)
    En effet, comme je le pensais, cette signature n'était pas bonne.
    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.

  7. #7
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Par défaut
    Waou, rapide !
    Merci encore une fois, j'ai testé avec la signature proposée et ça soulève toujours la même erreur.
    De ce fait, je vais poster une question relative à la génération de .idl sur le forum vb.

Discussions similaires

  1. Appeler dll 32bits depuis un process 64nits
    Par pepito3364 dans le forum C++
    Réponses: 7
    Dernier message: 02/04/2015, 16h05
  2. Appel DLL delphi depuis C#
    Par joc02 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 14/05/2009, 16h23
  3. Appel dll .NET depuis Java
    Par olibara dans le forum C#
    Réponses: 5
    Dernier message: 23/03/2009, 15h28
  4. Appel de fonctions d'une DLL C++ depuis Java
    Par max_rossito dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 11/01/2007, 22h54
  5. Appeler une unité depuis une DLL
    Par xavier ringoise dans le forum Langage
    Réponses: 2
    Dernier message: 03/02/2006, 21h31

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