Bon, le titre n'est pas bien explicite... Je vais essayé d'etre plus clair :
J'ai une appli qui charge le contenu d'un fichier ini avec l'API adequate (GetPrivateProfileString)
D'abord un un petit bout de code commenté :
push offset FichierIni ; Nom du fichier
push 48 ; Taille du buffer
push esi ; Adresse du buffer
push 0 ; Buffer par defaut
push offset FirstKey ; Adresse de la premiere Key
push offset Section ; Section
call GetPrivateProfileStringA
; ---> Recupere le texte associé à la premiere Key
Ce code est valable pour une entrée !!!
Si on a plusieurs entrées, Ou on fait une boucle ou on place chaque KEY dans nos data... Jusque la, pas de probleme...
Key1=Microsoft
Key2=Ibm
Key3=Apple
Ce code est valable que si on a definis le nombre d'entrée et la valeur de chaque entrées !!!
Dans l'exemple : 3 entrées, 3 valeurs predefinis
Alors moi j'ai fait ca quand on ne sais pas à l'avance combien d'entree contiendra le fichier INI :
---> Je ne place aucune valeur dans le les data...
Je place juste un compteur dans le fichier INI (Des que l'utilisateur entre un nouvelle Key, j'incremente le compteur de 1)
Et je place cette valeur dans l'API à la place de OFFSET FIRSTKEY
Le probleme, c'est un byte ! Et la fonction n'attend pas autre chose...(String)
Si l'utilisateur a entrée plus de 255 valeur et bien on est dans la limite du byte et probleme !!!
Tant que l'incrementation ne va pas jusqu'a 255, tout va bien...
Donc comment aller au dela de 255 dans cette exemple ?
Oui, je sais, c'est pas clair du tout, je suis désolé :(
Je suis pret à etre plus clair, si j'ai un soupson de solution pour ce qui ont suivis...
OFFSET FIRSTKEY est un Lp -> "Point to a null-terminated string that specifies the section containing the key name..."
Je ne comprends pas ton problème de "dépassement" byte
De plus cette famille d'API est deprecated et conservée uniquement pour la compatibilité 16bits... Et, apparement tu essaies de sortir du format INIT traditionel...
Tu devrais télécharger le dernier SDK: http://www.microsoft.com/downloads/details.aspx?FamilyId=E15438AC-60BE-41BD-AA14-7F1E0F19CA0D&displaylang=en
__________________________ www.rosasm.org/ www.quanta-it.com/easbell/RosAsmForum
En fait mon probleme n'est pas de savoir comment marche la fonction
Je sais bien que la fonction attends que l'on Push une chaine, etc...
Mon soucis est le suivant,
En admettant que dans le fichier INI, j'ai les données suivante :
- KeyFirst1=aaaa
- KeyFirst2=bbbb
- KeyFirst3=cccc
- KeyFirst4=dddd
- Etc...
Pour recuperer la valeur aaaa, on push KeyFirst1 dans la fonction et on recupere la donnée... Et ainsi de suite KeyFirst2, 3, 4, ...
Moi je voudrais recuperer les données de l'INI par une variable byte que je positionne à 1 et que j'incremente :
1=aaaa
2=bbbb
3=cccc
4=dddd
Etc...
Dans le code de recuperation je place un ADD Valeur de la Key pour recuperer l'ensemble des données...1, 2, 3, 4...
Boucle:
Push Fichier ini
..
.Push Compteur ---> compteur byte à la place d'une chaine !!!
..
Call GetPrivateProfileString
cmp eax, 0 ---> Fin de boucle
add Compteur, 1
jmp boucle
Dans cette exemple simpliste et si le fichier comporte - de 255 valeurs à recuperer, ca fonctionne parfaitement !
Mais comment recuperer plus de 255 valeurs sans etre obligé de faire :
key1=aaaa
key2=bbbb
key3=cccc
...
key255=gggg
...
key600=zzzz
... Etc
Je ne comprends pas le problème de limitation du contenu de Lp.
Si LpString est un pointeur sur une variable DWord (qui donc te permet de simuler ta chaîne asccii) et inc de D$Lpstring 256...
Tu devrais pouvoir passer to Lp pour des valeurs asscii de 0 a FFF.
Si cela nest pas suffisant: LpString sur un QWord et pareillement add 256 soir 0 à FFFFFFF etc.
Ceci dit, si tu dois utiliser absolument KeyFirst comme préfixe:
Je vois que tu a tres bien compris mon soucis et ta reponse ma ouvert les yeux... Par moment, je vais trop dans la complication sans reflechir !
J'ai transformer mon compteur(dword) en string dans un buffer, j'incremente le compteur et je place le resultat du buffer dans la fonction...
Ca marche Impec !
Ce qui donne à vol d'oiseau :
mov count,1 --> Place le compteur à 1
Boucle:
mov eax, count
mov edi, offset buffer ---> Buffer pour la conversion
Call VERS MA ROUTINE DE CONVERSION (DWORD TO STRING)
PS : Tout ca parceque dans mon prog, on ne sait pas à l'avance combien d'entrée comporte le fichier INI... C'est l'utilisateur qui entre les données !
Et que je ne veut pas ajouter 50 000 Buffer avec 50 000 data...