C'est Edwin Knoppert qui est remerciable (
http://www.hellobasic.com).
Et c'est "PB" du forum anglais qui m'a permis de trouver la fonction API adéquate.
NY152 a écrit :Pourquoi ça coince dans la DLL, mystère ...
Mystère résolu: VB ne lit pas le registre EAX du CPU (comme PB le fait), mais la pile. Donc, à titre préventif (et au risque de passer pour un gros lourd!!!), cette subtilité t'impose un test supplémentaire pour s'assurer que tu ne cultiveras un bug plutôt sournois...
Je m'explique la fonction API SysAllocStringByteLen_() alloue de la mémoire. Donc la fonction DLL de PB alloue de la mémoire par cette fonction API.
Si VB appelle 50 fois la même fonction, je ne connais pas le processus de libération de la mémoire:
- Si elle se fait juste après l'appel de la fonction DLL, c'est bon, il n'y a rien de plus à comprendre. (Et c'est a priori ce que dit PB, mais comme il y a eu du changement dans l'API depuis...)
- Par contre, si elle se fait en fin d'application, tu risques d'avoir des soucis tôt ou tard quand tu utiliseras longtemps ton application.
Tu devrais faire un ultime test:
Sous VB, fais le petit programme suivant:
1) D'abord, mets un message box quelconque (pour faire une pause en début de programme)
2) Puis, fais une boucle pour appeler la fonction DLL (celle qui te retourne le message "Message DLL Ok") 1 million de fois.
3) Enfin, remets un message box pour faire une pause de fin.
A l'exécution de ce programme, tu es donc invité à cliquer sur [Ok], la boucle s'effectue 1 million de fois et puis, tu es à nouveau invité à cliquer sur [Ok] avant que le programme ne soit terminé.
A la pause du début, avant de cliquer sur [Ok], ouvre le gestionnaire de tâches avec [Ctrl]+[Alt]+[Suppr], va dans l'onglet [Performances], et note la mémoire physique disponible (Elle est en kilooctets). Puis, dans ton programme clique sur [Ok] pour que la boucle démarre.
Le second message box s'affiche et regarde à nouveau la mémoire physique disponible dans le gestionnaire de tâches.
Si elle a bougé (ou si tu as un crash de l'appli), indique-le ici. ça signifie qu'il faudra cleaner la chaîne, à chaque fois, une fois que VB l'a lu. Init_Winamp() et Close_Winamp() devront alors respectivement amorcer et détruire un thread de nettoyage automatique (c'est assez rapide à faire maintenant qu'on sait l'essentiel)
Si elle n'a pas bougé d'un seul Ko, c'est que tout est nickel. Dans ce cas, je te souhaite bon courage.