none
Réalisation d'une DLL ? RRS feed

  • Question

  • Bonjour a tous,

    Je me suis jamais lancé dans la réalisation d'une DLL et je ne sais pas trop encore comment faire mais la question n'est pas comment faire pour l'instant :) !

    Les questions est si je realise une DLL devient elle compatible avec les autres environnements ?

    c'est a dire que cette DLL sera compatible avec du VBscript ? (C, C++, ...)

    Merci


    Cordialement,

    vendredi 3 août 2012 10:06
    Auteur de réponse

Réponses

  • Pour utiliser une dll VB.Net avec VBScript, Vba ou VB6, une solution est de créer un projet de type "Bibliothèque de classes", puis dans les propriétés du projet :

    • Onglet Application -> Information de l'assembly -> Cocher 'Rendre visible l'assembly par COM'
    • Onglet Compiler -> Cocher 'Inscrire pour COM Interop'

    Une fois le projet généré, tu auras dans le répertoire Debug (ou Release) un .dll et un .tlb qu'il faut inscrire dans le registre via 'regasm' dans une invite de commande (ComClass est le nom de mon projet) :

    D:\Users\Jacques\Documents\Visual Studio 2010\Projects\ComClass\ComClass\bin\Deb
    ug>regasm comclass.dll /tlb:comclass.tlb /codebase
    Microsoft (R) .NET Framework Assembly Registration Utility 4.0.30319.1
    Copyright (C) Microsoft Corporation 1998-2004. Tous droits réservés.

    <Message d'avertissement : assembly non signé>

    Inscription des types réussie
    L'assembly a été exporté vers 'D:\Users\Jacques\Documents\Visual Studio 2010\Projects\ComClass\ComClass\bin\Debug\comclass.tlb' et la bibliothèque de types a été inscrite avec succès.

    Une fois cela fait, tu peux l'utiliser sous VBScript :

    Dim ComClass1
    
    On Error Resume Next
    Set ComClass1 = CreateObject("ComClass.MyCOMVBClass")
    If Err.Number = 0 Then
      MsgBox ComClass1.MyProp
      Set ComClass1 = Nothing
    Else
      MsgBox "Erreur : " & Err.Number & VBCrLf & Err.Description
    End If

    Le code de la dll ne fait pas grand chose : il renvoie le nom de la machine :

    Public Class MyCOMVBClass
        Public Property MyProp() As String
            Get
                MyProp = System.Environment.MachineName
            End Get
            Set(MyName As String)
    
            End Set
    
        End Property
    End Class
    

    Tout cela est expliqué dans la kb817248

    sauf que le modèle COMClass cité ne fait plus partie des modèles proposés (l'article concerne VB2005). Et la traduction est totomatik.

    La dll reste utilisable en .Net en ajoutant une référence .NET :

    Imports ComClass
    Public Class Form1
    
        Private Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
            Dim ComClass1 As New ComClass.MyCOMVBClass
            MsgBox(ComClass1.MyProp)
        End Sub
    End Class

    Et en VBA/VB6 également, en ajoutant une référence ou pas selon que tu utilises 'New' ou 'CreateObject' 

    Option Explicit
    
    Private Sub Command1_Click()
      ' Avec ajout de la référence
      Dim ComClass1 As ComClass.MyCOMVBClass
      
      Set ComClass1 = New ComClass.MyCOMVBClass
      MsgBox ComClass1.myprop
      Set ComClass1 = Nothing
    End Sub
    
    Private Sub Command2_Click()
      ' Sans ajout de la référence
      Dim ComClass1 As Object
      
      Set ComClass1 = CreateObject("ComClass.MyCOMVBClass")
      MsgBox ComClass1.myprop
      Set ComClass1 = Nothing
    End Sub
    
    Le petit projet ComClass en PJ


    Cordialement, Jacques

    • Marqué comme réponse TroxsaEditor dimanche 5 août 2012 11:02
    samedi 4 août 2012 10:06

Toutes les réponses

  • Bonjour Troxsa,

    Content de te relire.

    Vu que Visual Studio compile une DLL en code intermédiaire puis en langage machine par le JIT, cette dernière peut être accessible depuis n'importe quel langage.

    Les fonctions doivent être Shared Public.

    J'ai créé un exemple que tu peux télécharger ici

    si tu as des questions, n"hésites pas


    fred on youTube
    PHP MySQL Web Site Creator
    fred


    • Proposé comme réponse Sygrien vendredi 3 août 2012 12:49
    • Modifié fred75 vendredi 3 août 2012 13:07
    vendredi 3 août 2012 12:44
  • Bonjour,
    Le 03/08/2012 14:44, fred75 a écrit :

    Bonjour Troxsa,

    Content de te relire.

    Vu que Visual Studio compile une DLL en code intermédiaire puis en langage machine par le JIT, cette dernière peut être accessible depuis n'importe quel langage.


    A l'intérieur de .Net

    Les fonctions doivent être Shared Public.

    J'ai créé un exemple que tu peux télécharger ici

    si tu as des questions, n"hésites pas


    Troxsa parle notamment de VBScript qui, à ma connaissance, ne peut utiliser que des composants Automation via
    'CreateObject' : http://msdn.microsoft.com/en-us/library/dcw63t7z%28v=vs.85%29.aspx

    Par ailleurs une bibliothèque de classe ne présentant pas de points d'entrée (voir avec Dependency Walker) il n'est pas possible
    de l'utiliser comme une 'Flat dll' (c'est à dire, ni .Com, ni .NET) avec :

    Declare
    Function NomFonction Lib "NomLibrairie.dll" ...
    -- 
    
    Cordialement,
    
    Jacques.
    

    Cordialement, Jacques
    vendredi 3 août 2012 13:50
  • Bonjour Troxsa,

    Content de te relire.

    Vu que Visual Studio compile une DLL en code intermédiaire puis en langage machine par le JIT, cette dernière peut être accessible depuis n'importe quel langage.

    Les fonctions doivent être Shared Public.

    J'ai créé un exemple que tu peux télécharger ici

    si tu as des questions, n"hésites pas


    fred on youTube
    PHP MySQL Web Site Creator
    fred


    Bonjour a tous :)

    Merci pour votre exemple Fred mais vous avez réalisé un projet Visual basic en appelant directement la function dans la form.

    Comment faire par exemple pour utiliser la DLL dans un projet VBA ou Vbscript ?

    Vous avez dit aussi : content de te relire
    Cela ne fais pas si longtemps que ça quand meme, si ? 


    Cordialement,

    vendredi 3 août 2012 17:55
    Auteur de réponse
  • Pour utiliser une dll VB.Net avec VBScript, Vba ou VB6, une solution est de créer un projet de type "Bibliothèque de classes", puis dans les propriétés du projet :

    • Onglet Application -> Information de l'assembly -> Cocher 'Rendre visible l'assembly par COM'
    • Onglet Compiler -> Cocher 'Inscrire pour COM Interop'

    Une fois le projet généré, tu auras dans le répertoire Debug (ou Release) un .dll et un .tlb qu'il faut inscrire dans le registre via 'regasm' dans une invite de commande (ComClass est le nom de mon projet) :

    D:\Users\Jacques\Documents\Visual Studio 2010\Projects\ComClass\ComClass\bin\Deb
    ug>regasm comclass.dll /tlb:comclass.tlb /codebase
    Microsoft (R) .NET Framework Assembly Registration Utility 4.0.30319.1
    Copyright (C) Microsoft Corporation 1998-2004. Tous droits réservés.

    <Message d'avertissement : assembly non signé>

    Inscription des types réussie
    L'assembly a été exporté vers 'D:\Users\Jacques\Documents\Visual Studio 2010\Projects\ComClass\ComClass\bin\Debug\comclass.tlb' et la bibliothèque de types a été inscrite avec succès.

    Une fois cela fait, tu peux l'utiliser sous VBScript :

    Dim ComClass1
    
    On Error Resume Next
    Set ComClass1 = CreateObject("ComClass.MyCOMVBClass")
    If Err.Number = 0 Then
      MsgBox ComClass1.MyProp
      Set ComClass1 = Nothing
    Else
      MsgBox "Erreur : " & Err.Number & VBCrLf & Err.Description
    End If

    Le code de la dll ne fait pas grand chose : il renvoie le nom de la machine :

    Public Class MyCOMVBClass
        Public Property MyProp() As String
            Get
                MyProp = System.Environment.MachineName
            End Get
            Set(MyName As String)
    
            End Set
    
        End Property
    End Class
    

    Tout cela est expliqué dans la kb817248

    sauf que le modèle COMClass cité ne fait plus partie des modèles proposés (l'article concerne VB2005). Et la traduction est totomatik.

    La dll reste utilisable en .Net en ajoutant une référence .NET :

    Imports ComClass
    Public Class Form1
    
        Private Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
            Dim ComClass1 As New ComClass.MyCOMVBClass
            MsgBox(ComClass1.MyProp)
        End Sub
    End Class

    Et en VBA/VB6 également, en ajoutant une référence ou pas selon que tu utilises 'New' ou 'CreateObject' 

    Option Explicit
    
    Private Sub Command1_Click()
      ' Avec ajout de la référence
      Dim ComClass1 As ComClass.MyCOMVBClass
      
      Set ComClass1 = New ComClass.MyCOMVBClass
      MsgBox ComClass1.myprop
      Set ComClass1 = Nothing
    End Sub
    
    Private Sub Command2_Click()
      ' Sans ajout de la référence
      Dim ComClass1 As Object
      
      Set ComClass1 = CreateObject("ComClass.MyCOMVBClass")
      MsgBox ComClass1.myprop
      Set ComClass1 = Nothing
    End Sub
    
    Le petit projet ComClass en PJ


    Cordialement, Jacques

    • Marqué comme réponse TroxsaEditor dimanche 5 août 2012 11:02
    samedi 4 août 2012 10:06