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 397
    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 397
    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 397
    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 397
    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 397
    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 397
    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