Je ne sais pas si c'est aussi la pile, mais il y a autre chose. Et le souci c'est que ça crashe dès que j'ajoute un paramètre dans la procédure appelée par CallFast malgré le respect du nombre de paramètres.
M'étant pris le crâne avec la copie de chaîne dans une structure, j'ai appris que l'action de copie d'une chaîne vers une autre...
...se fait en 2 étapes:
Code : Tout sélectionner
1 (Copie) ChaineResiduelle.S + ChaineSource.S
2 (Allocation mémoire et attribution) Attribution du nom 'ChaineDestination' au pointeur de la 'ChaineResiduelle'
En passant, un nom, après compilation est une adresse (pointeur).
Ce serait la raison pour laquelle 'Encore' s'ajoute à 'Coucou!' : Un retour de procédure appelée par CallFast() est une copie de chaîne avortée (étape 1 sans l'étape).
Mais ce qui m'exaspère encore plus, ce sont ces 3 codes qui diffèrent de peu pour pouvoir récupérer une chaîne:
>> Les 1ers et 2nd codes ne fonctionnent pas correctement
>> Le 3ème code qui 'injecte' une chaîne
non nulle (même si c'est "haricot", "zoby one", etc...) fonctionne
(C'est un peu tordu pour échanger des chaînes avec des fonctions DLLs)
Code : Tout sélectionner
Declare.L Fonction(c.L) ; << Entrée LONG, Sortie LONG
Declare.S Mux()
Global *Fonc = @Fonction()
Debug Mux()
Debug "RIEN!!!"
End
Procedure.L Fonction(c.L) ; << Idem
String.S = "Coucou!"
*Ptr = @String
ProcedureReturn *Ptr
EndProcedure
Procedure.S Mux()
*Ptr = CallFunctionFast(*Fonc, 0) ; << Injection d'un LONG nul
String.S = ""
Repeat
Ch.L = PeekB(*Ptr)
If Ch = 0: Break: EndIf
Debug Chr(Ch)
*Ptr + 1
ForEver
ProcedureReturn String.S
EndProcedure
Code : Tout sélectionner
Declare.L Fonction(c.S) ; << Entrée STRING, Sortie LONG
Declare.S Mux()
Global *Fonc = @Fonction()
Debug Mux()
Debug "Ci-dessus, une fausse chaîne (<> 'Coucou!')"
End
Procedure.L Fonction(c.S) ; << Idem
String.S = "Coucou!"
*Ptr = @String
ProcedureReturn *Ptr
EndProcedure
Procedure.S Mux()
*Ptr = CallFunctionFast(*Fonc, "") ; << Injection d'un STRING nul
String.S = ""
Repeat
Ch.L = PeekB(*Ptr)
If Ch = 0: Break: EndIf
Debug Chr(Ch)
*Ptr + 1
ForEver
ProcedureReturn String.S
EndProcedure
Code : Tout sélectionner
Declare.L Fonction(c.S) ; << Entrée STRING, Sortie LONG
Declare.S Mux()
Global *Fonc = @Fonction()
Debug Mux()
Debug "Ci-dessus, ma chaîne est enfin trouvée ! ! !"
End
Procedure.L Fonction(c.S) ; << Idem
String.S = "Coucou!"
*Ptr = @String
ProcedureReturn *Ptr
EndProcedure
Procedure.S Mux()
*Ptr = CallFunctionFast(*Fonc, "Au pifomètre") ; << Injection d'un STRING non nul
String.S = ""
Repeat
Ch.L = PeekB(*Ptr)
If Ch = 0: Break: EndIf
Debug Chr(Ch)
*Ptr + 1
ForEver
ProcedureReturn String.S
EndProcedure
PS: Le code n°2 a quand même réussi à me donner le pointeur du titre d'une autre application dans la barre des tâches... (En semaine, je ne bois pas)