Utilisation du Presse Papier
Page 1 sur 1
Utilisation du Presse Papier
Ce programme simple montre l'appel des fonctions pour utiliser le PressePapier. Le programme original est de Gerry Galvin.
Ici, il se contente de récupérer l'argument de la ligne de commande et de la stocker dans le pressepapier.
Ici, il se contente de récupérer l'argument de la ligne de commande et de la stocker dans le pressepapier.
- Code:
;---Programme 64 bits
; origine programme : Gerry Galvin : Clipboard.asm (Thanks to Iczelion for corrections)
; adapté à Nasm 64 bits par Paul Durelin
; utilisation du Presse Papier
;**********************************************************************
; Ce programme prend l'argument de la ligne de commande et la stocke dans le pressepapier.
; Cet argument est le plus souvent le chemin complet d'un fichier.
; Pour une utilisation facile de ce programme, il suffit de placer un raccourci dans
; le dossier windows "Send to". Ensuite vous choisissez dans l'explorateur un fichier
; vous cliquer sur le bouton droit de la souris puis choisissez "Envoyer vers "
; puis choisissez l'option correspondant à votre raccourci
; et si tout fonctionne, vous retrouvez le nom complet du chemin du fichier choisi dans le presse papier.
;
; Pour tester ce programme, il suffit de glisser sur le .exe, n'importe quel fichier avec la souris.
;**********************************************************************
%include "../windowsinc64.inc"
;======================================
; Constantes
;======================================
CF_TEXT equ 1
;=======================================
; segment des données initialisées
;=======================================
segment .data
;code page 850 é=82h à=85h è=8Ah ê=88h
;szChForm db "%u ",0 ; format décimal pour la fonction wsprintfA
szMessFin db 10,13,"Fin du programme.",0
szRetourLigne db 10,13,0
szMessErr db "Erreur allocation mémoire",10,13,0
szPasdedonnees db "Aucune donnée dans l'argument d'entrée",0
szTitre db "Clipboard",0
;=======================================
; segment des données non initialisées
;=======================================
segment .bss
hMain resq 1
szResult resb 100
hMemory resq 1
pMemory resq 1
len resq 1
CmdLn resq 1
;=======================================
; segment de code
;=======================================
segment .text
global Main
extern afferreur,affmessageP,affconsoleP,afftoutregistreP,afftoutreg8a15P,affmemoireP,affmessage,saisieClavier,vidpiles
;exemple appel
;push __LINE__
;call afftoutregistreP
;push __LINE__
;push rbp
;push 2
;call affmemoireP
Main:
sub rsp, 8h ; alignement de la pile avant tout appel de procédure
sub rsp,20h
;recup handle de l'instance du programme
mov rcx,NULL
call GetModuleHandleA
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
call GetCommandLineA ; récupération de la ligne de commande
cmp byte [rax],22h ; tests quote ouvrante "
jne .noline
inc rax ;on saute la quote "
mov rdi,rax ;debut chaine
mov al,22h ;code pour la quote "
or rcx,-01 ;compteur ( élimination du nom du programme)
repne scasb ;rdi pointe vers la quote fermante
inc rdi ; on la saute
mov [CmdLn],rdi ; et on garde l'adresse du début de l'argument
mov rcx,[CmdLn]
call lstrlen ; calcul de la longueur restante
cmp eax,NULL ; si zero
je .noline ; pas de données
inc rax ; pour inclure le zero de fin de chaine
mov [len],rax ; on garde la longueur de l'argument
mov rcx,NULL
call OpenClipboard ; ouverture du presse papier
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov rcx,GMEM_MOVEABLE ; reservation de la place memoire
mov rdx,[len] ; de la longueur de la chaine
call GlobalAlloc
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov [hMemory],rax
mov rcx,rax
call GlobalLock
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov [pMemory],rax ; on garde le pointeur de la memoire allouée
mov esi,[CmdLn] ;alimentation avec le début de l'argument
mov edi,[pMemory] ;et avec le pointeur de la memoire alloué
mov ecx,[len] ;et la longueur de l'argument
rep movsb ; et hop on recopie le tout
call EmptyClipboard
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov rcx,[hMemory]
call GlobalUnlock
mov r9,__LINE__ - 1
cmp eax,NULL
jne .suite ; pas d'erreur
call GetLastError
cmp rax,NULL ;
jne .erreurGlobal ; il y a un pb
.suite:
mov rcx,CF_TEXT ; c'est du texte
mov rdx,[hMemory] ; on reprend la chaine stockée en mémoire
call SetClipboardData ; mise à jour du pressepapier avec la chaine de caractères
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
call CloseClipboard ; fermeture du presse papier
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
jmp .main_fin
.noline: ; affichage des erreurs.
mov rdx,szPasdedonnees
jmp .mess
.erreurGlobal:
mov rdx,szMessErr
.mess:
mov rcx,NULL
mov r8,szTitre
mov r9,MB_OK
call MessageBoxA
mov r9,__LINE__ - 1
cmp eax,NULL
je .gestionerreurs
mov rax,0
jmp .main_fin
.gestionerreurs:
call afferreur
mov rax,1
jmp .fin
.main_fin:
;push szMessFin
;call affconsoleP
;call saisieClavier
.fin:
mov rcx,rax ; code retour
call ExitProcess ; fin du programme
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|