Liste des imprimantes en Masm32

Soyez le premier à donner votre avis sur cette source.

Snippet vu 652 fois

Contenu du snippet




En cherchant dans les documentations , les outils (instructions , fonctions , procédures , ...)
à utiliser dans un programme pour faire des sorties sur imprimantes , en assembleur (Masm32) ,
j'ai trouvé (au passage) la fonction EnumPrinters . J'ai alors écrit le programme assembleur qui
suit , juste pour mettre en application la dite fonction .
Le programme fonctionne sur mon ordinateur sous Windows 7 . Il affiche effectivement la liste
des imprimantes installées sur mon système .
Pour une installation donnée , il serait peut-être nécessaire d'adapter le programme en
remplaçant dans les inclusions :

include e:masm32includewindows.inc
include e:masm32includemasm32.inc
include e:masm32includekernel32.inc
include e:masm32includewinspool.inc
include e:masm32macrosmacros.asm

includelib e:masm32libmasm32.lib
includelib e:masm32libkernel32.lib
includelib e:masm32libWinspool.lib

la lettre e , par la lettre de l'unité où se trouve le répertoire masm32 .

Le même résultat (affichage liste des imprimantes installées) peut être obtenu avec le bout
de programme Visual Basic 6.0 suivant dans lequel , Sur la feuille , on place un contrôle ListBox
dans lequel seront affichés les noms des imprimantes installées :

Option Explicit

Private Sub Form_Click()
Dim X As Printer
For Each X In Printers
List1.AddItem X.DeviceName
Next
End Sub

Pour ce qui est de l'impression elle-même , pour l'instant , je rame et même me perds dans
les documentations (Programmer's Reference , sites Microsoft) qui ne contiennet pas (à ma connaissance)
une rubrique sur l'impression qui indiquerait des liens sur les fonctions , instructions que
nécessitent (en assembleur) les sorties sur imprimantes .
Et encore moins , des exemples sur le sujet !

Je suis un nouveau venu dans codes-sources , et ce programme est le premier que je poste sur
le site .

Toute opinion , tout commentaire sur ce programme seront les bienvenus et me seront
certainement instructifs .

De même , toute aide sur la programmation de l'mpression , sera grandement appréciée ; et avec
mes remerciements à l'avance .

Le programme masm32
===================

; Par Erathos
;
;EnumPrinters : voir
;https://msdn.microsoft.com/en-us/library/windows/desktop/dd162692(v=vs.85).aspx
; ou
;Win32 Programmer's Reference (WIN32.HLP)
;
comment *---------------------------------------------
e:masm32binml.exe /c /coff Enum_Prn.asm
e:masm32binlink.exe /SUBSYSTEM:CONSOLE Enum_Prn.obj
Enum_Prn.exe
-----------------------------------------------------*
;
; Le programme donne la liste des noms des imprimantes installées
; sur l'ordinateur .
; Il utilise la fonction EnumPrinters qui renvoie
; - dans le tableau liste_printer , une structure de type PRINTER_INFO_4
; par imprimante installée . Le 1er membre d'une structure
; est un pointeur sur une chaîne contenant le nom d'une imprimante
; - dans la variable nbprinter , le nombre de structures renvoyées
; donc d'imprimantes installées sur l'ordinateur
; - dans la variable caracEcrits , le nombre de caractères copiés dans
; le tableau .
;
; D'autre part , la fonction EnumPrinters renvoie dans le registre eax
; . une valeur non nulle si elle s'est effectuée correctement
; . sinon 0 (zéro) si elle ne s'est pas terminée correctement .
; Dans ce cas , elle renvoie dans la variable caracEcrits , le nombre
; de caractères nécessaires si la taille du tableau est insuffisante .
;
; Le programme utilise le fichier Enum.inc qui contient les inclusions
; nécessaires à son fonctionnemnt .
;
.486
.model flat, stdcall
option casemap :none

include e:masm32includewindows.inc
include e:masm32includemasm32.inc
include e:masm32includekernel32.inc
include e:masm32includewinspool.inc
include e:masm32macrosmacros.asm

includelib e:masm32libmasm32.lib
includelib e:masm32libkernel32.lib
includelib e:masm32libWinspool.lib

.const
lnListe equ 200 ;taille (octets) tableau de structures imprimantes
lnZc equ 12 ;taille zone de conversion

.data?
adr_print DWORD ?

periph equ this PRINTER_INFO_4
liste_printer BYTE lnListe dup (?)

caracEcrits DWORD ? ;nombre de carac. écrits dans tableau structures
nbprinter DWORD ? ;nombre de structures renvoyées par EnumPrinters

.data
numPeriph DWORD 0 ;n° d'élément, donc de structure, dans tableau structures

message_val BYTE 'Taille du tableau de structures insuffisante .',13,10
BYTE 'Elle doit ˆtre ‚gale … : ' ;ˆ:ê ‚:é …:à
val_ascii BYTE lnZc dup (' '),0

Titre BYTE 'Liste des imprimantes :',13,10

.code
start:
cls

lea eax,Titre
call visu ;pour afficher

invoke EnumPrinters,PRINTER_ENUM_LOCAL,NULL,4,ADDR liste_printer,
lnListe,ADDR caracEcrits,ADDR nbprinter

;eax contient la valeur de retour de EnumPrinters .
;Si eax = 0 , la fonction ne s'est pas terminée correctement ;
;probablement à cause de la taille du tableau de structures qui
;est insuffisante . Dans ce cas , la fonction place dans la variable
;caracEcrits , la taille recquise pour le tableau .

cmp eax,0
jne noms_periph

mov eax,caracEcrits

invoke dwtoa,eax,ADDR val_ascii ;pour afficher
lea eax,message_val ;la taille recquise
call visu ;pour le tableau de structures

exit

noms_periph:
;La fonction s'est effectuée correctement et renvoie dans nbprinter
;le nombre de structures placées dans le tableau liste_printer ,
;donc le nombre d'imprimantes installées sur l'ordinateur .

mov ecx,nbprinter
boucleperiph:
push ecx

;Calcule l'offset de la structure de n° numPeriph
;par rapport au début du tableau de structures et
;le met dans ebx

mov eax,numPeriph
mov ecx,type PRINTER_INFO_4 ;type met taille de la structure dans ecx
mul cl
mov ebx,eax ;ebx:offset de la structure dans tableau de structures

;Affiche le nom de l'imprimante contenu
;dans le membre pPrinterName de la structure

mov eax,periph [ebx].pPrinterName
call visu

inc numPeriph ;pour passer à la structure suivante dans le tableau

pop ecx
loop boucleperiph

exit
;
; ================øøøøøøøøøø================
;
visu proc

;Procédure d'affichage .
;Reçoit dans eax un pointeur sur la zone à afficher .

mov adr_print,eax
print adr_print
print " ",13,10

ret

visu endp
;
; ================øøøøøøøøøø================
;
end start
;

A voir également

Ajouter un commentaire

Commentaires

Commenter la réponse de Erathos

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.