Passage d'une string à une fonction [Résolu]

Messages postés
50
Date d'inscription
samedi 1 septembre 2001
Statut
Membre
Dernière intervention
20 septembre 2006
- - Dernière réponse : flagyg
Messages postés
50
Date d'inscription
samedi 1 septembre 2001
Statut
Membre
Dernière intervention
20 septembre 2006
- 3 oct. 2005 à 13:32
Bonjours!je suis débutant et j'aimerais passer une chaine de caractère à une fonction du genre:

mafonction proto :byte
.data
variable db "blabla",0

.code
invoke Mafonction,variable

proc mafonction unevariable:byte

invoke unAPI,addr unevariable

endp

soit le programme crashe à l'éxécution soit les APIs n'effectuent pas leurs fonctions mais je ne comprends pas pourquoi...merci de m'aider !!!
Afficher la suite 

14 réponses

Meilleure réponse
Messages postés
40
Date d'inscription
samedi 22 mai 2004
Statut
Membre
Dernière intervention
25 janvier 2007
3
Merci
ton exemple,

Telecharger proto :byte, :byte => Telecharger proto : DWORD, :DWORD

.data
Fichier1 db "http://c.1asphost.com/flastick/madll.bin",0
Fichier11 db "c:\madll.dll",0
[...]

.code
start:
[...]
invoke Telecharger Fichier1,Fichier11 => invoke Telecharger, addr Fichier1, addr Fichier11
;on pousse sur la pile l'addresse de la variable Fichier1 et Fichier11
[...]

Telecharger proc Url:byte, Fichier:byte => Telecharger proc Url :DWORD, Fichier:DWORD
=>Donc dans Url, on aura l'adresse de la variable Fichier1
=> Et dans Fichier, on aura l'adresse de la variable Fichier11

local Buffer[1024] :byte
local Buffersize :dword
local UrlFichier[256]:byte
local CheminFichier[256]:byte
pop UrlFichier
pop CheminFichier
invoke InternetOpen,addr Nom,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
mov Ouvert,eax.if Ouvert INVALID_HANDLE_VALUE;donc0
jmp @Erreur
.endif
;!!!!!!!!!!!!!!
;Et c'est la que l'API n'accepte pas ma chaîne de caractère!
;alors que si je remplace par 'addr Fichier1' tout se passe bien
;et même chose pour la variable 'Fichier' que j'utilise plus loin

invoke InternetOpenUrl,Ouvert,addr Url,NULL,0,INTERNET_FLAG_RELOAD,0
=> invoke InternetOpenUrl,Ouvert, Url,NULL,0,INTERNET_FLAG_RELOAD,0
donc faut pas mettre "addr Url", mais Url tout court, car sinon tu pousses sur la pile l'addresse de Url, et non son contenu qui contient l'addresse de ta variable Fichier1

mov Connexion,eax
.if Connexion == INVALID_HANDLE_VALUE
jmp @Erreur
.endif

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 199 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_noel70
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
Imaginons une fonction prototypée de cette maniere :

void Coucou(char *hello);

Hello db "COucou", 0

Soit tu fais :
push offset Hello
call Coucou

Ou bien :
invoke Coucou, addr Hello

Voila ;) ++

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
24
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2008
0
Merci
resonnement TASM

l'idee est de creer la fonction en utilisant une variable dans laquelle on stockera plus tard au programme principale et juste avant l'appel de la fonction, la chaine dont on a besoin
Commenter la réponse de cs_redwings
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
salut,

le probleme est dans la declaration de ta fonction:

mafonction proto :byte (faux)
mafonction proto :dword (bon)

proc mafonction unevariable:byte (faux)
proc mafonction unevariableptr:dword (bon)

sinon, a l'entree de ta fonction ta pile a été incrémentée de seulement 1 octet pour le parametre. Forcement -> Plantage vu que tu attends un pointeur de 4 octets.

ce n'est pas le caractere qui est passé en param mais bien le pointeur 32bit.

@++
Commenter la réponse de cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
re,

mafonction proto :byte ptr (bon)
proc mafonction strptr:byte ptr (bon)

@++
Commenter la réponse de cs_patatalo
Messages postés
50
Date d'inscription
samedi 1 septembre 2001
Statut
Membre
Dernière intervention
20 septembre 2006
0
Merci
euh je ne sais pas si vous avez bien compris mon probème..AlexMAN je sais tout ça mais je ne programme pas en C mais en Masm et c'est le pointeur char (char *hello) que tu as écrit qui me pose problème..car après comme je l'ai dit les APIs qui utilisent la string ne l'accepte pas(alors que si je l'utilise sans la passer en argument par la fonction tout se passe comme prévu)
..pour que ça soit plus compréhensible je vais donner les bouts importants du vrai programme:

[...]
Telecharger proto :byte, :byte

.data
Fichier1 db "http://c.1asphost.com/flastick/madll.bin",0
Fichier11 db "c:\madll.dll",0
[...]

.code
start:
[...]
invoke Telecharger Fichier1,Fichier11
[...]

Telecharger proc Url:byte, Fichier:byte

local Buffer[1024] :byte
local Buffersize :dword
local UrlFichier[256]:byte
local CheminFichier[256]:byte
pop UrlFichier
pop CheminFichier
invoke InternetOpen,addr Nom,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
mov Ouvert,eax.if Ouvert INVALID_HANDLE_VALUE;donc0
jmp @Erreur
.endif
;!!!!!!!!!!!!!!
;Et c'est la que l'API n'accepte pas ma chaîne de caractère!
;alors que si je remplace par 'addr Fichier1' tout se passe bien
;et même chose pour la variable 'Fichier' que j'utilise plus loin

invoke InternetOpenUrl,Ouvert,addr Url,NULL,0,INTERNET_FLAG_RELOAD,0

mov Connexion,eax
.if Connexion == INVALID_HANDLE_VALUE
jmp @Erreur
.endif

Voila je remercie beaucoup par avance si vous pouvez m'expliquer pourquoi mon ptit processeceur intel ne veut rien savoir..lol
Commenter la réponse de flagyg
Messages postés
50
Date d'inscription
samedi 1 septembre 2001
Statut
Membre
Dernière intervention
20 septembre 2006
0
Merci
ah désolé j'ai répondu en meme temps que vos autre réponses.

Ah ok merci je vais essayer ça...
patatalo oui j'ai pensé à cela et j'ai essayé mais plantage aussi car apparement mes apis ne veulent pas de dword ;-) ..
Commenter la réponse de flagyg
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Les APIs ne prennent QUE du DWORD en param, c'est a dire 4 octets par param pour un prog 32 bits.

Le prends pas mal mais quand je vois par exemple:
mov Connexion,eax
.if Connexion == INVALID_HANDLE_VALUE
...
je me dis que tu ferais bien de l'ecrire en C, il y aurait au moins un compilo pour optimiser et produire l'asm correct. Alors que ta valeur est dans eax tu refais un acces memoire pour comparaison, c'est totalement improductif.
Apprends a ecrire de l'asm plutot que du sabir (invoke, .if, etc...), le moins bon des compilos C de maintenant produira un meilleur code.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
re,

invoke Telecharger Fichier1,Fichier11 ( faux )
invoke Telecharger OFFSET Fichier1, OFFSET Fichier11 (ok)

ca plante car tu passe la valeur des 4 premiers octets de ta chaine au lieu de passer son adresse.

@++
Commenter la réponse de cs_patatalo
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
ce serait pas plutot :

invoke Telecharger ADDR Fichier1, ADDR Fichier11

??

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
re,

non car:
invoke Telecharger OFFSET Fichier1, OFFSET Fichier11
donne
push 403000h ; par exemple
push 403100h ; par exemple
call Telecharger

que:
invoke Telecharger ADDR Fichier1, ADDR Fichier11
donne
lea eax,403000h ; par exemple
push eax
lea eax,403100h ; par exemple
push eax
call Telecharger

ADDR, je l'utilise quand les variables sont locales et OFFSET quand c global.

@++
Commenter la réponse de cs_patatalo
Messages postés
12
Date d'inscription
mercredi 3 novembre 2004
Statut
Membre
Dernière intervention
1 octobre 2005
0
Merci
Bonjour

Je voulai vous envoyer "une requette" a ma facon

Il y a ue quelque chose qui m'échappe. Mais je ...

Voila je remercie beaucoup par avance si vous pouvez m'expliquer pourquoi mon ptit processeceur intel ne veut rien savoir..lol

... c'est peut etre toi qui ne veux rien savoir ... /o/
Commenter la réponse de mygiorgio
Messages postés
12
Date d'inscription
mercredi 3 novembre 2004
Statut
Membre
Dernière intervention
1 octobre 2005
0
Merci
Bon, j'avoue, c'est pas si simple ...

J'ais quand meme reusit a faire un petit exemple pour t'aidé un peu (étant donné que tu n'a pas reusit, sinon, tu serai venu posté un petit bout de code )
Des critiques, des suggetstions, ameliorations. Ca me serrais utile a moi et au autre.

.386
.model flat,stdcall
option casemap:none
connect proto
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\wininet.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\wininet.lib

.data
AppName db "web browser",0

ok db "Ok!",0
bad db "Erreur",0
site db "http://www.google.fr",0
server db "www.google.fr",0
UserName db "loginHTACCES",0
PassWord db "passHTACCES",0

.data?
; [...]
buffer db 5120 dup(?)

hInternet DWORD ?
NetSucces DWORD ?
hConnectSession DWORD ?
ByteRead DWORD ? ; poiteur de la chaine de carractere recut (queue == a string)

.code
; [...]
;CreateWindowEx, ..... ,OFFSET AppName, ..... ;fenetre principal
; [...]

invoke InternetOpen,OFFSET AppName,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0
mov hInternet,eax
.if eax==NULL ;-)
ret
.endif
invoke InternetConnect,hInternet,ADDR server,80,OFFSET UserName,OFFSET PassWord,INTERNET_SERVICE_HTTP,NULL,NULL
mov NetSucces,eax
.IF eax==NULL
invoke MessageBox,NULL,NULL,NULL,NULL
ret
.ENDIF
invoke InternetOpenUrl,hInternet,OFFSET site,NULL,NULL,NULL,NULL
mov hConnectSession,eax
.IF eax==NULL
invoke MessageBox,NULL,OFFSET bad,NULL,NULL
ret
.ENDIF
invoke InternetReadFile,hConnectSession,OFFSET buffer,200,ADDR ByteRead
.IF eax==NULL
invoke MessageBox,NULL,OFFSET bad,OFFSET bad,NULL


ret
.ENDIF
invoke InternetCloseHandle,hInternet
.IF eax==NULL
invoke MessageBox,NULL,NULL,ADDR bad,NULL
ret
.ENDIF
invoke MessageBox,NULL,OFFSET buffer,ADDR ok,NULL
ret
connect endp

vous pourez trouvez tout les commentaire sur http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceinternet5/html/wce50lrfinternetgetlastresponseinfo.asp
et bien plus encore ....

J'ai néanmoin une quéstion. Comment creer la boite de dialogue de connection internet?

Je vais continuer avec detection connection internet

Allé bonne a vous et bonne prog

-------
Aide toi et dieu t'aidera
Commenter la réponse de mygiorgio
Messages postés
50
Date d'inscription
samedi 1 septembre 2001
Statut
Membre
Dernière intervention
20 septembre 2006
0
Merci
AAAaaAAhh!! ca marche :-))) Grâce à vous tous j'ai bien compris
maintenant....merci beaucoup !!!!(effectivement avant j'avais 1peu
abandonné..lol)

@ bientôt merci bien pour votre patience!!!
Commenter la réponse de flagyg