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++/CLI Discussion :

VB .NET > C : comment utiliser une fonction d'une DLL .Net dans un programme C ?


Sujet :

C++/CLI

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 8
    Par d�faut VB .NET > C : comment utiliser une fonction d'une DLL .Net dans un programme C ?
    Bonjour,

    J'aimerai connaitre la d�marche pour pouvoir utiliser une fonction qui est dans une DLL VB.Net dans un programme �crit en C ?

    Exemple de la dll VB :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public
     
    Module myMod
     
    Function myFunc() AsInteger
     
    Return 1
     
    EndFunction
    End
     
    Module
    Exemple du code C que j'ai utilis� :

    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
     
    HINSTANCE hDLL; 
     
    // Handle to DLL
    LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
     
     
    hDLL = LoadLibrary("e:\\temp\\mydll.dll");
     
    if (hDLL != NULL)
    {
       lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"myFunc");
     
          if (!lpfnDllFunc1)
          {
                // Do the job ....
          }
     
       FreeLibrary(hDLL);
    }
    La DLL semble se charger et decharger correctement mais le pointeur de fonction est constamment nul. J'ai essay� avec des vairantes telles que :
    lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"myMod.myFunc");
    Mais rien n'y fait.

    Merci d'avance

    A+

    Male

  2. #2
    Expert confirm�
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par d�faut
    R�ponse courte : c'est impossible, sauf si on passe par la cr�ation d'un composant COM
    R�ponse longue : en fait, ni le VB.Net, ni le C# ne permettent d'exporter des fonctions � partir d'une dll. En revanche, l'IL le peut, mais on obtiens vite des trucs tordus car il faut d�compiler la dll vers l'IL, la traiter, et la recompiler. Ca s'appelle de l'Inverse PInvoke (cherche sur google) et c'est loin d'�tre �vident, cf ici.
    La deuxi�me m�thode est de cr�er une dll en C++/CLI qui exportera les fonctions voulues et qui se chargera de faire correspondre les fonctions avec les objets .NET. C'est la m�thode la plus simple � mettre en oeuvre � mon avis pour les petits et moyens projets. Si c'est tr�s complexe, le passage par la cr�ation d'un composant COM pourrai simplifier les choses.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 8
    Par d�faut Solution partielle
    Bon apr�s m'�tre acharn� j'ai r�ussi � faire tourner le truc mais �a ne me convient pas � 100%.

    Premier probl�me de ma solution : ce n'est pas du C mais du C++
    Second probl�me la DLL est d�clar�e par regasm de mani�re statique je ne peux donc pas deployer facilement la solution (enfin si quelqu'un a une meilleure id�e je suis preneur).

    Sur XP �a se passe bien en �tant simple admin mais sur Vista faut carr�ment lever tous les verrous de l'admin.

    La proc�dure suivante est valable pour VS 2005.

    Tout d'abord cr�er la DLL en VB..; exemple de code pour le projet mydllname :
    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
    Public Interface myInterface
     
        Function Addition(ByVal Num1 As Integer, ByVal Num2 As Integer, ByRef Result As Integer) As Integer
     
    End Interface
     
    Public Class Class1
     
        Implements myInterface
     
        Function myFunc(ByVal Num1 As Integer, ByVal Num2 As Integer, ByRef Result As Integer) As Integer Implements myInterface.Addition
     
            Result = Num1 + Num2
     
            Return Result
     
        End Function
     
    End Class
    Aller dans les propri�t�s du projet et r�gler l'option rendre l'assembly visible par COM (onglet application > bouton informations de l'assembly)

    Aller ensuite dans l'onglet signature et signer l'assembly avec un nom fort.
    Ici : mydllname.snk

    Compiler la dll.

    Lancer la commande dos de l'environnement VS, aller dans le dossier de la dll puis taper :
    /regasm mydllname.dll /tlb:mydllname.tlb /codebase

    Cr�er le projet en C++ (h� oui en C j'ai pas trouv� j'ai dit)

    Exemple de code :

    d'abord importer la biblioth�que de type :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    // Import the type library.
    #import "ClassLibrary2.tlb"
    using namespace ClassLibrary2;
    En supposant que la DLL soit plac� dans le meme dossier que l'appli CPP (exe ou dll, en g�n�ral dans le dossier release) et que la TLB soit plac�e dans le dossier du projet CPP (avec le code source).

    Sinon varier les plaisir avec des trucs du genre :
    #import "..\mydllname\bin\Release\ClassLibrary2.tlb"

    ensuite utiliser la fonction qui vous int�resse comme ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	HRESULT hr = CoInitialize(NULL);
     
    	ClassLibrary2::myInterfacePtr myPtr(__uuidof(Class1));
     
    	long lResult = 0;
    	char buffer[256];
     
    	// Call the Add method.
    	myPtr->Addition(12,158, &lResult);
     
    	// Uninitialize COM.
    	CoUninitialize();
    En esp�rant que �a puisse vous servir autant qu'� moi.

    A+

    Male

  4. #4
    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
    tu peux regarder dans mon tutoriel, l'interop�rabilit� avec COM : http://nico-pyright.developpez.com/t...p2/#Lcominteop et le hosting de CLR http://nico-pyright.developpez.com/t...rop2/#Lhostclr pour plus de pr�cisions

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 8
    Par d�faut
    Merci Nyco,

    Durant mes recherches j'�tais tomb� sur ton tuto que j'avais d�j� archiv� car bien utile au premeir regard.

    Malheureusement mon niveau ne me permet pas d'en comprendre toutes les subtilit�s.

    Vraissemblablement le "hotsing de CLR" (j'avoue que je ne sais m�me pas ce que ce cela veut dire) semblerait r�pondre � mes besoins si j'ai bien compris car la DLL manag�e serait plac�e dans le m�me dossier que mon appli et ne n�cessiterait pas d'�tre r�f�renc�e dans le registre (regasm) ?

    Je vais approfondir le sujet. Merci encore.

    A+

    Male

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 18
    Dernier message: 25/06/2007, 09h45
  2. R�ponses: 3
    Dernier message: 29/04/2006, 13h02
  3. comment utiliser les fonctions d'une dll
    Par sebled dans le forum MFC
    R�ponses: 3
    Dernier message: 24/02/2006, 16h59
  4. R�ponses: 4
    Dernier message: 17/03/2004, 17h24

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