Assembleur 64 avec le compilateur nasm
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment :
Manga Chainsaw Man : où acheter le Tome 17 ...
Voir le deal
19.99 €

Utilisation du Presse Papier

Aller en bas

Utilisation du Presse Papier Empty Utilisation du Presse Papier

Message par Admin Lun 13 Mar - 11:04

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.
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
Admin
Admin
Admin

Messages : 38
Date d'inscription : 28/11/2016

https://assembleur64.kanak.fr

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum