La boite selection de fichier

Voir le sujet précédent Voir le sujet suivant Aller en bas

La boite selection de fichier

Message par Admin le Mar 6 Déc - 18:49

L'API windows propose en standard plusieurs boites de dialogue liées à un usage particulier. Nous disposons de 2 fonctions pour créer celles liées à la sélection des noms de fichiers : une pour le choix d'un fichier à ouvrir GetOpenFileNameA , l'autre pour le choix d'un fichier à écrire GetSaveFileNameA.  Le bon coté c'est que les deux font appel à la même structure OPENFILENAME.
Dans le programme qui suit nous utiliserons les 2 fonctions et nous contenterons d'afficher les noms choisis dans la console.
Dans la partie .data, nous préparons le titre à afficher dans la boite et les critères de sélection des fichiers. Ici nous avons crée 2 options : tous les fichiers par le choix *.* et les fichiers assembleurs par le choix *.asm . Vous pouvez ajouter d'autres sélections ou n'en mettre aucune.
Pour les autres zones, les commentaires et la documentation sur Internet vous permettent de connaitre le contenu de chacune.
Pour la fonction écriture, le paramètre OFN_OVERWRITEPROMPT permet de confirmer l'écrasement du fichier si celui ci existe déjà.
Voici le code :
Code:

;--choixFichier.asm  programme 64 bits
; Fenêtre de Choix des fichiers

%include "../windowsinc64.inc"

;=======================================
; segment des données initialisées
;=======================================
segment .data

szMessFin  db 10,13,"Fin du programme.",0
szRetourLigne db 10,13,0

szFilter db "Asm Files (*.asm)",0,"*.asm",0
    db "All Files (*.*)",0,"*.*",0,0
szDefExt db "asm",0
szTitreChoix db  "Choisir le fichier !",0


;instance de la structure des fichiers
ofna align 8
ofn:
 istruc OPENFILENAME
 at OPENFILENAME.nFilterIndex,  dd  1h
 at OPENFILENAME.nMaxFile,      dd MAX_PATH
 at OPENFILENAME.nMaxFileTitle, dd MAX_PATH
  iend
LGOFN  equ $ - ofn ;longueur de la structure ofn

;=======================================
; segment des données non initialisées
;=======================================
segment .bss
hMain   resq 1
szFile     resb MAX_PATH *2
szFileTitle resb MAX_PATH *2

szResult  resb 100
 
;=======================================
; segment de code
;=======================================
segment .text
    global Main
 extern afferreur,affconsoleP,affmessage,saisieClavier

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   .erreur
 mov [hMain],rax
 mov  byte[szFile],0
 ;préparation pour la fenêtre de choix du fichier
 mov dword[ofn+OPENFILENAME.lStructSize],LGOFN   ; longueur de la structure
 mov dword[ofn+OPENFILENAME.lpstrFilter],szFilter ; filtre des fichiers
    mov dword[ofn+OPENFILENAME.lpstrFile],szFile    ; buffer du nom complet du fichier
 mov dword[ofn+OPENFILENAME.lpstrInitialDir],NULL  ; pointeur vers un repertoire de départ
 mov dword[ofn+OPENFILENAME.lpstrDefEx],szDefExt    ; définition de l'extention
 mov dword[ofn+OPENFILENAME.lpstrTitle],szTitreChoix ;titre de la fenetre
 mov dword [ofn+OPENFILENAME.lpstrFileTitle],szFileTitle ; buffer du nom reduit du fichier
 mov dword[ofn+OPENFILENAME.hwndOwner],NULL   ; fenetre sans parent
 mov dword [ofn+OPENFILENAME.Flags], OFN_PATHMUSTEXIST + OFN_FILEMUSTEXIST
 mov rcx,ofn
 call GetOpenFileNameA  ; affichage fenetre de choix du fichier
 mov  r9,__LINE__
 cmp rax,0
 je .erreur
 ; preparer la commande de compilation
 lea rax, [ofn+OPENFILENAME.lpstrFile]  ; récuperation du nom complet du fichier choisi
 ;
 ;
    push qword[rax]   ; adresse du nom du fichier
    call affconsoleP ; affichage dans la console
 push szRetourLigne
 call affconsoleP ; affichage dans la console
 push szFile      ; verification du buffer de reception
 call affconsoleP
 push szRetourLigne
 call affconsoleP ; affichage dans la console
 push szFileTitle      ; verification du contenu
 call affconsoleP
 ;
 call saisieClavier    ; pour pause
 ;choix du fichier pour ecriture
 mov dword[ofn+OPENFILENAME.Flags],OFN_HIDEREADONLY + OFN_OVERWRITEPROMPT
 mov rcx,ofn
 call GetSaveFileNameA
 mov  r9,__LINE__
 cmp rax,0
 je .erreur
 lea rax, [ofn+OPENFILENAME.lpstrFile]  ; récuperation du nom complet du fichier choisi
    push qword[rax]   ; adresse du nom du fichier
    call affconsoleP ; affichage dans la console
 push szRetourLigne
 call affconsoleP ; affichage dans la console
 push szFile      ; verification du buffer de reception
 call affconsoleP
 push szRetourLigne
 call affconsoleP ; affichage dans la console
 push szFileTitle      ; verification du contenu
 call affconsoleP
 
 mov rax,0
 
 jmp .main_fin
.erreur:
 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
avatar
Admin
Admin

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

Voir le profil de l'utilisateur http://assembleur64.forumactif.com

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

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