begin process at 2012 02 17 11:50:10
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Tutoriaux

 > CRÉER UNE DLL STANDARD AVEC VB6

CRÉER UNE DLL STANDARD AVEC VB6


 Information sur le tutoriel

Note :
Aucune note

 Description

permet de créer de veritable DLL standard et non des DLL ActiveX avec Visual Basic 6. option qui n'exite pas en standard.


Tutorial


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 . C e 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.


"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


"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

/DEF: "C:\Program Files\Microsoft Visual Studio\VB98\maDll\ DefModule1 .d ef "

/DLL

/INCREMENTAL:NO

/OPT:REF

/MERGE:.rdata=.text

/IGNORE:4078


En gras et en rouge, 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)


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


En pratique

  • Créer un nouveau projet EXE standard.
  • Ajouter une référence à Micr osoft Scripting Runtime Library.
  • Supprimer Form 1 du projet.
  • Ajouter un module de Base.
  • Ajouter le code suivant au module.



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



  • Dans propriété du projet, mettre objet de démarrage sur Sub Main (ça se fait automatiquement en principe)
  • Créer l'exécutable (Projet1.exe).


Deuxièmement : hacker link.exe

  • Renommer Link.exe (Sur mon ordi il se trouve dans le dossier " C:\Program Files\Microsoft Visual Studio\VB98 ") en Linklnk.exe
  • copier Projet.exe dans le dossier
  • Renommer Projet1.exe en Link.exe


Troisièmement : Créer

  • 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
  • Ajouter un Module de base
  • Ajouter le code suivant au module.


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


Quatrièmement : Exporter les fonctions de

  • Ouvrer l'éditeur de texte (NotePad par exemple)
  • Ecrire les lignes suivantes


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


  • Enregistrer avec l'extention (.def) dans dossier du projet de


L a déclaration N AME définit le nom de 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. L e fichier ( .Def ) doit également donner la liste la position ordinale de chaque fonction exportée précédée d'un symbole @. Plus de détail: Fichiers de définition de module (.def)


  • Retourner à au projet et c ompilez la DLL. Cela devrait invoquer la nouv eau l ink er.


Cinquièmement : Tester la DLL

  • Créer un nouveau projet EXE standard nommé MathLibTest
  • Ajouter un module de base
  • Ajouter au module les déclarations des 3 fonctions


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



  • Ajouter à la form 3 bouttons (CmdIncrement, CmdDecrement et CmdSquare) et 3 zones de texte (TxtIncrement,TxtDecrement et TxtSquare)


  • ajouter au module de la form le code suivant


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




  • Exécuter F5




Attention . Ça reste du VB. Les fonctions ne sont pas aussi rapide qu'en C/C++


Plus d'info:

Creating a Windows DLL with Visual Basic | O'Reilly Media en anglais

How To : Make a standard DLL en anglais aussi


 Historique

17 mars 2009 16:30:20 :
erreurs lors du transfert du fichier. des mots ont été suprimés. j'ai vérifié
17 mars 2009 22:10:24 :
une DLL

Commentaires

Commentaire de Londonic le 16/03/2009 14:52:46

Ca affiche quoi ?

Commentaire de medkarim le 16/03/2009 15:10:37

désolé. je n'ai pas compris la question

Commentaire de ghuysmans99 le 17/03/2009 19:03:05

On dit "une" DLL.

Commentaire de MadM@tt le 17/03/2009 19:33:17

Par mal !

Commentaire de aitnamane le 30/03/2009 00:28:07

c'est géniale merci bien

Commentaire de SerialKillerAngel le 18/04/2009 17:55:12

merci pour ce tuto ! c'est vrai que c'est quand même plus logique de faire des dll standard que de "simples" contrôles ActiveX. :/

Commentaire de Neo.balastik le 05/05/2009 10:57:58

L'avantage, si l'on peut dire, est de ne pas devoir enregistrer la DLL via regsvr32.exe.
Au fait, suffit-il de placer la DLL dans le répertoire où l'EXE est lancé pour qu'elle soit trouvée ?

Commentaire de CADRATURE le 13/06/2009 12:20:40

Très très intéressant
Merci

Commentaire de reacen le 23/06/2009 11:07:41

Super Merci, mais je préfère enregistrer ma Dll ActiveX avec regsvr32. C'est plus simple ;)

Commentaire de hichambayern le 14/07/2009 16:55:16

Dim oFS As New Scripting.FileSystemObject :type non défini

Commentaire de NISANDSYSTEMS le 09/01/2010 14:26:19

Bonjour,
Tu as oubli de préciser le lien de ton idée à
cette adresse là:
http://bbil.developpez.com/traductions/vb6/create-dll/

@++

Commentaire de VicoLaChips2 le 02/02/2010 01:47:32

Oui puis en plus c'est hyper rapide à développer quoi ?
hop hop vla ma dll quoi ? quoi !
Moi j'ai développer un moteur 3D avec QBasic !! si si.... ça ma pris du temps ;)

Commentaire de vicosta le 08/02/2010 13:48:35

Si c'est pour eviter le regsvr32, c'est trop tard:
il existent des méthodes bien plus simples pour utiliser ses dll et ocx sans manifest ni regsvr32,
le tout en mode INVITE sur n'importe quel PC

Commentaire de simox1990 le 08/02/2010 22:55:53

je ne compris rien

Commentaire de vicosta le 09/02/2010 01:29:03

Une dll standard n'a pas besoin de msvbvm60.dll pour pouvoir fonctionner.
Si l'on programme une .dll sous visual basic,
celle-ci aura toujous besoin de la librarie msvbvm60.dll
pour traduire le code et pour pouvoir répondre aux fonctions demandées.
Bien sûr, on peut y rajouter un peu d'asm' mais alors la c'est mieux de programmer en C toute la dll.




Commentaire de turkishh le 02/05/2010 14:25:27

Je Comprend Rien Du Tous Tu L'explique Mal !

Commentaire de vicosta le 02/05/2010 23:00:30

C'est tout simplesment parce qu'un DLL 'fabriquée' sous une language C, C+, n'a pas besoin d'aucune autre DLL pour pouvoir être interpretée, ...
tant que dans le cas où d'une DLL 'fabriquée' sous le language Visual Basic, cette dernière a toujours besoin de la DLL msvbvm60.dll afin de pouvoir être interpretée... Cependant, les systèmes d'exploitation à partir de XP sont déjà équipés d'origine avec la DLL msvbvm60.dll, ce qui permet de contourner le problème.

Quant à faire fonctionner les DLL et OCX sans les installer, il suffit d'enregistrer son CLSID sous hkey_current_user avec des API du registre et ça fonctionne sans rien demander à personne. Par contre on ne peut pas les enregistrer sous hkey_local_machine parce qu'il faut avoir les permissions administrateur.

Pour trouver l'ID de l'OCX ou de la DLL produite par VB, il y a sur ce site des nombreux exemples de programes capables de le faire.



Commentaire de test999999 le 21/06/2010 04:54:39

Je ne vois aucun caractère en gras ou en rouge dans ton code pour ton linker version modifiée.
Est-ce voulu pour nous envoyer dans le champ ou est-ce une erreur de ta part.

Commentaire de sedera15 le 02/01/2012 11:37:57

c'est tutoriel est très intéressant! ça m'ouvre des portes! merci bien

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,076 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales