ASSEMBLER UNE DLL
Si vous avez parcouru les Tuts d'Aczelion, vous avez dû voir dans le Tut 17 comment programmer vos propres DLL (Dynamic Link Libraries),
il donne également une brève explication pour les assembler mais revenons sur ce point. Je ne vais pas m'attarder de trop, on va passer à la
pratique, ça vaut bien toutes les explications.
Faites l'exemple avec moi:
Je pratique sur la DLL du Tut24 'MouseHook.asm'. D'abord il faut étudier comment elle a été construite et
c'est extrêmement important. Car pour compiler une DLL il faut deux fichiers.
le fichier *.asm et le fichier *.def qui en découle.
;--------------
;MouseHook.asm
;--------------
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.const
WM_MOUSEHOOK equ WM_USER+6
.data
hInstance dd 0
.data?
hHook dd ?
hWnd dd ?
.code
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD ;<-- on commence toujours par
push hInst ; déclarer le point d'entrée
pop hInstance ; de la DLL.
mov eax,TRUE ; Mais peu importe...
ret
DllEntry Endp
MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD ; Ce qui nous intéressent ce sont les
invoke CallNextHookEx,hHook,nCode,wParam,lParam ; noms des fonctions appartenant à la
mov edx,lParam ; DLL
assume edx:PTR MOUSEHOOKSTRUCT
invoke WindowFromPoint,[edx].pt.x,[edx].pt.y
invoke PostMessage,hWnd,WM_MOUSEHOOK,eax,0
assume edx:nothing
xor eax,eax
ret
MouseProc endp
InstallHook proc hwnd:DWORD
push hwnd
pop hWnd
invoke SetWindowsHookEx,WH_MOUSE,addr MouseProc,hInstance,NULL
mov hHook,eax
ret
InstallHook endp
UninstallHook proc
invoke UnhookWindowsHookEx,hHook
ret
UninstallHook endp
End DllEntry
Et voilà à partir du contenu de la DLL on va pouvoir créer le fichier *.def. Puisqu'on sait que notre
MouseHook.asm contient les fonctions MouseProc, InstallHook et
UninstallHook, le fichier *.def sera ainsi définit:
;-------------
;MouseHook.def
;-------------
LIBRARY MouseHook ; <-- c'est le nom de votre DLL
EXPORTS ; <-- et les fonctions qu'elle met à notre disposition.
MouseProc
InstallHook
UninstallHook
Voilà vous écrivez ça dans MouseHook.def
Maintenant nous avons les deux fichiers en question (*.asm et *.def), nous pouvons passer à la phase d'assemblage de la DLL
en elle-même.
D'abord sachez que j'ai créé un dossier spécial assemblage en tout genre dans mon dossier Masm32.
Mon dossier s'appelle C:\Masm32\_essai et dedans se trouvent les petits outils indispenssables que sont :
- ML.exe
;
- RC.exe (+Rcdll.dll)
; ça c'est pour passer
- LINK.exe (+Mspdb50.dll)
; d'un *.asm --> *.exe
- Cvtres.exe
;
Normalement ils sont présent dans c:\Masm32\bin
Pour une DLL vous devez en plus rajouter:
- Lib.exe
Allons-y gaiement:
J'ouvre une fenêtre DOS et je me déplace dans ce répertoire:
cd\
cd Masm32
cd _essai
Pour vous se sera normalement cd bin
ET VOICI LA VÉRITABLE OPÉRATION:
(Les majuscules et minuscules n'ont pas d'importance sur le nom de votre DLL mais elles en ont pour le reste.
Attention au paramètre /Cp par exemple.)
ml /c /coff /Cp mousehook.asm
link /DLL /NOENTRY /def:mousehook.def /subsystem:windows mousehook.obj
J'ai automatisé ce processus dans un fichier *.bat nommé Assembles_DLL.bat. Vous pourrez vous en servir en
plaçant Assembles_DLL dans ..C:\Masm32\Bin ou pour moi ..C:\Masm32\_essai. Placez dans le même répertoire
vos deux fichiers *.asm et *.def sous le nom de 'DLL.asm' et 'DLL.def'. Exécutez 'Assembles_DLL' et vous
obtiendrez une DLL du nom de (Et non pas DLL.dll) Nom_qui_est_dans_DLLdef.dll.
Il sera donc inutile de la renommer.
Par Morgatte