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

Vos contributions VB6 Discussion :

[Article] Créer une Dll standard avec VB6


Sujet :

Vos contributions VB6

  1. #1
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 125
    Points : 128
    Points
    128
    Par défaut [Article] Créer une Dll standard avec VB6
    c'est un tutoriel en anglais que j'ai trouvé : http://www.windowsdevcenter.com/pub/...reate_dll.html

    cependant, je n'ai pas trouvé d'equivalent en français (bien que le tuto date un peu)

    je propose donc une adaptation du tutoriel en français

    Introduction
    Visual basic est considéré comme le premier programme de développement rapide d’application avec son interface graphique élégante et la facilité d'utilisation globale. Ce qui a permis avec relativement peu d'expérience de programmation de réaliser en quelques minutes ce qui a souvent pris jour pour les programmeurs utilisant des langages comme C et C ++.

    Cependant, ce concept de langage de programmation simple destiné à des programmateurs inexpérimentés a vraiment limité VB. Certes on peut faire beaucoup de chose avec VB comme des EXE standard, des DLL ActiveX…. Mais on ne peut pas créer des DLL standard. Du moins en théorie.

    Le projet
    Nous allons créer une simple bibliothèque de fonctions mathématiques qui permet d’incrémenter, de décrémenter et de calculer le carré d’un chiffre.

    Premièrement : Créer un proxy linker
    Le rôle de Link.exe est combiner des programmes compilés avec l'extension .OBJ et générer un fichier exécutable (.exe).

    Voici les paramètres de la ligne de commande passé par VB à « Link.exe » pour créer une DLL ActiveX par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    "C:\Program Files\Microsoft Visual Studio\VB98\maDll\Class1.OBJ" "C:\Program Files\Microsoft Visual Studio\VB98\maDll\Module1.OBJ" "C:\Program Files\Microsoft Visual Studio\VB98\maDll\Projet1.OBJ" "C:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" 
    /ENTRY:__vbaS 
    /OUT:"C:\Program Files\Microsoft Visual Studio\VB98\maDll\Projet1.dll" /BASE:0x11000000 
    /SUBSYSTEM:WINDOWS,4.0 
    /VERSION:1.0 
    /DLL  
    /INCREMENTAL:NO 
    /OPT:REF 
    /MERGE:.rdata=.text 
    /IGNORE:4078
    Voici les paramètres à passer pour créer une DLL standard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    "C:\Program Files\Microsoft Visual Studio\VB98\maDll\Class1Files\Microsoft Visual Studio\VB98\maDll\Module1.OBJ" "C:\Program Files\Microsoft Visual Studio\VB98\maDll\Projet1.OBJ" "C:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" 
    /ENTRY:__vbaS 
    /OUT:"C:\Program Files\Microsoft Visual Studio\VB98\maDll\Projet1.dll" /BASE:0x11000000 
    /SUBSYSTEM:WINDOWS,4.0 
    /VERSION:1.0 
    /DEF: "C:\Program Files\Microsoft Visual Studio\VB98\maDll\DefModule.def"   
    /DLL  
    /INCREMENTAL:NO 
    /OPT:REF 
    /MERGE:.rdata=.text 
    /IGNORE:4078
    En gras, c’est ce qu’il faut ajouter à la ligne de commande juste avant le switch /DLL. C’est le chemin d’accées du fichier de définition de module.

    Les fichiers de définition de module (.def) fournissent à l'éditeur de liens des informations sur les exportations et les attributs ainsi que d'autres données concernant le programme devant être lié. Ceux qui ont fait du C/C++ connaissent ça.

    Plus d’info sur les fichiers (.def) : Fichiers de définition de module (.def) http://msdn.microsoft.com/fr-fr/libr...9h(VS.80).aspx

    L’objectif est de faire passer à link.exe les nouveaux paramètres.

    En pratique
    1.Créer un nouveau projet EXE standard.
    2.Ajouter une référence à Microsoft Scripting Runtime Library.
    3.Supprimer la Feuille Form1 du projet.
    4.Ajouter un module de Base.
    5.Ajouter le code suivant au module.
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    Option Explicit
     
    Public Sub Main()
     
       Dim SpecialLink As Boolean, fCPL As Boolean, fResource As Boolean
       Dim intPos As Integer
       Dim strCmd As String
       Dim strPath As String
       Dim strFileContents As String
       Dim strDefFile As String, strResFile As String
       Dim oFS As New Scripting.FileSystemObject
       Dim fld As Folder
       Dim fil As File
       Dim ts As TextStream, tsDef As TextStream
     
       strCmd = Command
     
       Set ts = oFS.CreateTextFile(App.Path & "\lnklog.txt")
     
       ts.WriteLine "Beginning execution at " & Date & " " & Time()
       ts.WriteBlankLines 1
       ts.WriteLine "Command line arguments to LINK call:"
       ts.WriteBlankLines 1
       ts.WriteLine "   " & strCmd
       ts.WriteBlankLines 2
     
       ' Determine if .DEF file exists
       '
       ' Extract path from first .obj argument
       intPos = InStr(1, strCmd, ".OBJ", vbTextCompare)
       strPath = Mid(strCmd, 2, intPos + 2)
       intPos = InStrRev(strPath, "\")
       strPath = Left(strPath, intPos - 1)
       ' Open folder
       Set fld = oFS.GetFolder(strPath)
     
       ' Get files in folder
       For Each fil In fld.Files
          If UCase(oFS.GetExtensionName(fil)) = "DEF" Then
             strDefFile = fil
             SpecialLink = True
          End If
          If UCase(oFS.GetExtensionName(fil)) = "RES" Then
             strResFile = fil
             fResource = True
          End If
          If SpecialLink And fResource Then Exit For
       Next
     
       ' Change command line arguments if flag set
       If SpecialLink Then
          ' Determine contents of .DEF file
          Set tsDef = oFS.OpenTextFile(strDefFile)
          strFileContents = tsDef.ReadAll
          If InStr(1, strFileContents, "CplApplet", vbTextCompare) > 0 Then
             fCPL = True
          End If
     
          ' Add module definition before /DLL switch
          intPos = InStr(1, strCmd, "/DLL", vbTextCompare)
          If intPos > 0 Then
             strCmd = Left(strCmd, intPos - 1) & _
                   " /DEF:" & Chr(34) & strDefFile & Chr(34) & " " & _
                   Mid(strCmd, intPos)
          End If
          ' Include .RES file if one exists
          If fResource Then
             intPos = InStr(1, strCmd, "/ENTRY", vbTextCompare)
             strCmd = Left(strCmd, intPos - 1) & Chr(34) & strResFile & _
                      Chr(34) & " " & Mid(strCmd, intPos)
          End If
     
          ' If Control Panel applet, change "DLL" extension to "CPL"
          If fCPL Then
             strCmd = Replace(strCmd, ".dll", ".cpl", 1, , vbTextCompare)
          End If
     
          ' Write linker options to output file
          ts.WriteLine "Command line arguments after modification:"
          ts.WriteBlankLines 1
          ts.WriteLine "   " & strCmd
          ts.WriteBlankLines 2
       End If
     
       ts.WriteLine "Calling LINK.EXE linker"
       Shell "linklnk.exe " & strCmd
       If Err.Number <> 0 Then
          ts.WriteLine "Error in calling linker..."
          Err.Clear
       End If
     
       ts.WriteBlankLines 1
       ts.WriteLine "Returned from linker call"
       ts.Close
    End Sub
    6.Dans propriété du projet, mettre objet de démarrage sur Sub Main (ça se fait automatiquement en principe)
    7.Créer l’exécutable (Projet1.exe).

    Deuxièmement : hacker link.exe
    1.Renommer Link.exe (Sur mon ordi il se trouve dans le dossier "C:\Program Files\Microsoft Visual Studio\VB98") en Linklnk.exe
    2.copier Projet.exe dans le dossier
    3.Renommer Projet1.exe en Link.exe

    Troisièmement : Créer la DLL
    1.Créer un nouveau projet DLL ActiveX nommé "MathLib". Bien qu’il est inutile dans notre projet, ne supprimer pas Class1. VB en a besoin lors de la compilation
    2.Ajouter un Module de base
    3.Ajouter le code suivant au module.

    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
     
    Option Explicit
     
    Public Const DLL_PROCESS_DETACH = 0
    Public Const DLL_PROCESS_ATTACH = 1
    Public Const DLL_THREAD_ATTACH = 2
    Public Const DLL_THREAD_DETACH = 3
     
    Public Function DllMain(hInst As Long, fdwReason As Long, lpvReserved As Long) As Boolean
       Select Case fdwReason
          Case DLL_PROCESS_DETACH
             ' No per-process cleanup needed
          Case DLL_PROCESS_ATTACH
             DllMain = True
          Case DLL_THREAD_ATTACH
             ' No per-thread initialization needed
          Case DLL_THREAD_DETACH
             ' No per-thread cleanup needed
       End Select
    End Function
     
    Public Function Increment(var As Integer) As Integer
       If Not IsNumeric(var) Then Err.Raise 5
     
       Increment = var + 1
    End Function
     
    Public Function Decrement(var As Integer) As Integer
       If Not IsNumeric(var) Then Err.Raise 5
     
       Decrement = var - 1
    End Function
     
    Public Function Square(var As Long) As Long
       If Not IsNumeric(var) Then Err.Raise 5
     
       Square = var ^ 2
    End Function
    Nous trouvons nos 3 fonctions mathématiques et une fonction DLLMain qui constitue le point d’entrée principal de la Dll

    Quatrièmement : Exporter les fonctions de la DLL

    1.Ouvrer l’éditeur de texte (NotePad par exemple)
    2.Ecrire les lignes suivantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    NAME MathLib
    LIBRARY MathMod
    DESCRIPTION "Add-on Library of Mathematical Routines"
    EXPORTS DllMain @1
            Increment @2
            Decrement @3
            Square @4
    Seules les fonctions déclarées dans la section exports seront visibles dans la Dll

    La déclaration NAME définit le nom de la DLL. La déclaration LIBRARY doit précéder la liste des fonctions exportées ou apparaissent sur la même ligne que la première fonction. Le fichier (.Def) doit également donner la liste la position ordinale de chaque fonction exportée précédée d'un symbole @.

    3.Enregistrer avec l’extention (.def) dans dossier du projet de la DLL
    4.Retourner au projet et compilez la DLL. Cela devrait invoquer la nouveau linker. Il va lister tout les fichiers du dossier du projet. S'il trouve un fichier .def, il ajoute le chemin d'acces à la ligne de commande. Si aucun fichier .def n'est trouvé, une Dll activeX sera créer.
    Cinquièmement : Tester la DLL
    1.Créer un nouveau projet EXE standard nommé MathLibTest
    2.Ajouter un module de base
    3.Ajouter au module les déclarations des 3 fonctions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public Declare Function Increment Lib "C C:\Program Files\Microsoft Visual Studio\VB98\mathdll\MathLib.dll" (value As Integer) As Integer
     
    Public Declare Function Decrement Lib "C C:\Program Files\Microsoft Visual Studio\VB98\mathdll\MathLib.dll " (value As Integer) As Integer
     
    Public Declare Function Square Lib " C:\Program Files\Microsoft Visual Studio\VB98\mathdll\MathLib.dll " (value As Long) As Long
    4.Ajouter à la form 3 bouttons (CmdIncrement,CmdDecrement et CmdSquare) et 3 zones de texte (TxtIncrement,TxtDecrement et TxtSquare)



    5.ajouter au module de la form le code 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
     
    Option Explicit
     
    Private Sub cmdDecrement_Click()
       txtDecrement.Text = Decrement(CInt(txtDecrement.Text))
    End Sub
     
    Private Sub cmdIncrement_Click()
       txtIncrement.Text = Increment(CInt(txtIncrement.Text))
    End Sub
     
    Private Sub cmdSquare_Click()
       txtSquare.Text = Square(CLng(txtSquare.Text))
    End Sub
     
    Private Sub Form_Load()
       txtIncrement.Text = 0
       txtDecrement.Text = 100
       txtSquare.Text = 2
    End Sub
    6.Exécuter F5

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Salut, medkarim.

    comme convenu nous avons développé ton idée et traduit l'article complet, une discussion à été ouverte pour commenter cet article :

    [Commentez] créer une DLL standard Windows en VB6



Discussions similaires

  1. [Commentez] Créer une DLL standard Windows en VB6
    Par SfJ5Rpw8 dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 06/01/2015, 00h16
  2. Retour d'une structure venant d'une DLL standard dans VB6
    Par andrebernard dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 18/09/2010, 18h51
  3. créer une dll ressource avec vs 2005 ?
    Par trent94 dans le forum Débuter
    Réponses: 0
    Dernier message: 22/02/2010, 14h02
  4. Créer une dll enregistrable avec c:\WINDOWS\system32\regsvr32.exe
    Par Immobilis dans le forum Général Dotnet
    Réponses: 13
    Dernier message: 09/03/2009, 21h37
  5. [VB6]comment créer une dll
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 12/04/2006, 14h32

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