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