Bonjour à toutes et tous !
Je butte sur le passage de paramètres sous forme de constantes non typées à une procédure ou à une fonction.
Pour prendre un exemple : le paramètre Buffer de la fonction API WriteFile :
Voici un bête programme d'essai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function WriteFile (FileHandle: THandle; const Buffer; NumberOfBytesToWrite: DWord; var NumberOfBytesWritten: DWord; Overlapped: POverlapped): Bool;
Dans la fonction ECRITURE_FICHIER, je passe un tableau de caractères comme paramètre. Dans le fichier résultat, il y a bien 6 caractères écrits mais... 6 caractères quelconques au lieu de 'Blabla'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 Program ESSAI; Uses Strings, WinCRT, Windows; Var HandleFichier : tHandle; NomFichier : Array [0..MAX_PATH] of Char; Function CREATION_FICHIER (NomF : pChar; var HandleF : tHandle) : LongBool; Begin HandleF := CreateFile(NomF,GENERIC_WRITE,FILE_SHARE_WRITE,Nil, CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0); CREATION_FICHIER := (HandleF <> INVALID_HANDLE_VALUE); End; Function ECRITURE_FICHIER (HandleF : tHandle; Chaine : pChar) : LongBool; Var NbBytesEcrits : DWord; Begin ECRITURE_FICHIER := WriteFile(HandleF,Chaine,StrLen(Chaine),NbBytesEcrits,Nil); End; Function FERMETURE_FICHIER (HandleF : tHandle) : LongBool; Begin FERMETURE_FICHIER := CloseHandle(HandleF); End; Begin InitWinCRT; StrCopy(NomFichier,'H:\Essai.txt'); if CREATION_FICHIER(NomFichier,HandleFichier) then begin if not ECRITURE_FICHIER(HandleFichier,'Blabla') then WriteBuf('Erreur '#233'criture',15); if not FERMETURE_FICHIER(HandleFichier) then WriteBuf('Erreur fermeture',16); end else WriteBuf('Erreur cr'#233'ation',15); ReadKey; DoneWinCRT; End.
Voici un extrait de l'output Assembleur :
Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 ALIGN DWORD ESSAI@ECRITURE_FICHIER PROC NEAR ; ; Function ECRITURE_FICHIER (HandleF : tHandle; Chaine : pChar) : LongBool; ; Var NbBytesEcrits : DWord; ; Begin ; PUSH EBP MOV EBP,ESP SUB ESP,8 @@?0: ; ; ECRITURE_FICHIER := WriteFile(HandleF,Chaine,StrLen(Chaine),NbBytesEcrits,Nil); ; PUSH 0 LEA EAX,[EBP-8] PUSH EAX PUSH DWORD PTR [EBP+8] CALL Strings@StrLen PUSH EAX LEA EAX,[EBP+8] PUSH EAX PUSH DWORD PTR [EBP+0Ch] CALL WriteFile ; ; End; ; MOV ESP,EBP POP EBP RET 8 ESSAI@ECRITURE_FICHIER ENDP
Par contre, lorsque j'utilise un tableau de caractères local à la fonction ECRITURE_FICHIER, c'est bien 'Blabla' qui est écrit dans le fichier résultat.
Output Assembleur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Function ECRITURE_FICHIER (HandleF : tHandle; Chaine : pChar) : LongBool; Var NbBytesEcrits : DWord; ChaineLocale : Array [0..7] of Char; Begin StrCopy(ChaineLocale,Chaine); ECRITURE_FICHIER := WriteFile(HandleF,ChaineLocale,StrLen(ChaineLocale),NbBytesEcrits,Nil); End;
Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 ALIGN DWORD ESSAI@ECRITURE_FICHIER PROC NEAR ; ; Function ECRITURE_FICHIER (HandleF : tHandle; Chaine : pChar) : LongBool; ; Var NbBytesEcrits : DWord; ; ChaineLocale : Array [0..7] of Char; ; Begin ; PUSH EBP MOV EBP,ESP SUB ESP,10h @@?0: ; ; StrCopy(ChaineLocale,Chaine); ; LEA EAX,[EBP-10h] PUSH EAX PUSH DWORD PTR [EBP+8] CALL Strings@StrCopy ; ; ECRITURE_FICHIER := WriteFile(HandleF,ChaineLocale,StrLen(ChaineLocale),NbBytesEcrits,Nil); ; PUSH 0 LEA EAX,[EBP-8] PUSH EAX LEA EAX,[EBP-10h] PUSH EAX CALL Strings@StrLen PUSH EAX LEA EAX,[EBP-10h] PUSH EAX PUSH DWORD PTR [EBP+0Ch] CALL WriteFile ; ; End; ; MOV ESP,EBP POP EBP RET 8 ESSAI@ECRITURE_FICHIER ENDP
Ma question : quelqu'un pourrait-il m'aider à comprendre la différence entre les deux ?
Merci d'avance !Envoyé par Référence Virtual Pascal
Partager