Page 2 sur 6

Publié : mar. 11/août/2009 0:43
par NY152
J'ai tenté d'utiliser la DLL dans Visual Basic 2008 Express et c'est beaucoup plus informatif.

Voici l'erreur indiquée (en lieu et place du plantage sous VB6) :

Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.

Bon ça me parle pas trop vu comme ça lol

Aussi si quelqu'un a une idée ...

Publié : mar. 11/août/2009 1:03
par Ollivier
ça ne te parle pas trop mais au moins, même si tu te sens largué, tu maintiens la communication, et la cerise sur le gateau, c'est que tu me donnes une info (type d'erreur)!

Aussi, ne t'inquiète pas, passé ce petit souci de retour de chaîne de PB vers VB, je pense que le reste ira beaucoup mieux.

Essaie ceci:

Code : Tout sélectionner

ProcedureDLL.I Test()
  Protected *AdresseChaine
  *AdresseChaine = SysAllocStringByteLen_("MESSAGE DE LA DLL OK", 20)
  ProcedureReturn *AdresseChaine
EndProcedure
Même si l'effet ne te parlera peut-être pas, continue à décrire ce qui se passera (type erreur) comme tu l'as fait.

Le tout dernier exemple de la page précédente renvoyait l'adresse mémoire (pointeur) de la chaîne.

Sous, VB, déclare la fonction Test() avec un retour de chaîne (string) même si j'ai mis un ".I" derrière "ProcedureDLL". A titre info, dans la pratique, I (Integer) c'est comme L (Long).

Publié : mar. 11/août/2009 1:10
par Ollivier
J'ai oublié: Ne mets pas l'option unicode. (je suis parti sur le principe que Init_Winamp() fonctionnait sans l'option unicode, donc testons sans...)

Publié : mar. 11/août/2009 1:33
par NY152
Ça ne plante plus mais résultat est marrant ca renvoi un nombre aléatoirement (positif ou négatif). Je pense qu'il s'agit du pointeur non ?

Publié : mar. 11/août/2009 4:08
par Ollivier
Sous VB6, déclare la fonction avec un string en sortie:

Private Declare Function Test Lib "ChaisPasNomDeFichierTasMis" () As String
!

Et donne-moi en des nouvelles...

Publié : mar. 11/août/2009 11:09
par NY152
Oui oui la fonction est bien déclarée en String

Publié : mar. 11/août/2009 15:22
par NY152
Pour changer voilà les fonctions qui s'exécute normalement :

Init_Winamp() = Elle charge les plugins
Winamp_Play() = Lance la lecture du média
Winamp_Pause() = No comment ^^
Winamp_Stop() = Pareil ^^
Quit_Winamp() = Stop la lecture et décharge les plugins
Winamp_InAbout() = Infos du plugin d'entrée
Winamp_InConfig() = Configuration du plugin d'entrée
Winamp_OutAbout() = Infos du plugin de sortie
Winamp_OutConfig() = Configuration du plugin de sortie

C'est déjà pas mal, très incomplet mais pas mal ^^

Publié : mar. 11/août/2009 16:07
par Ollivier
Je prends note de ces infos et regarderai le code dès que possible. Mais, si tu veux, pour faire tourner un code complet et assez consistant en procédures diverses, je préfère faire les choses étapes par étapes. ça peut sembler ennuyant au départ mais ça permet de travailler efficacement par la suite.

C'est pour cette raison que je te fais subir cette batterie de tests, et que je m'exécute aussi lentement qu'une tortue!

Donc, à la base VB6 et PB s'échangent des pointeurs, nombres entiers, nombres flottants et chaînes. Si ces quatre types de données sont ok en entrée, comme en sortie (2 tests par type de données), le reste se fera rapidement (correction éventuelle dans PB à partir du code que tu m'as donné)

Visiblement, il n'y a aucune difficulté pour entrer et sortir des pointeurs comme des nombres entiers. Les nombres flottants, on verra après, c'est une broutille. Par contre, les chaînes, aux dernières nouvelles, quand tu compiles et testes la fonction Test() plus haut, tu me dis qu'elle te retourne des chiffres aléatoires, positifs ou négatifs. Est-ce que, depuis hier tu as réussi à obtenir la chaîne "MESSAGE DE LA DLL OK" sous VB6?

Si c'est oui, logiquement, je pourrai alors commencer à vérifier tout ton code.

Publié : mar. 11/août/2009 17:45
par NY152
Non j'ai rien d'autre que des chiffres. Pour le reste des fonctions je regarderais ce soir ^^

Publié : mar. 11/août/2009 20:33
par Ollivier
Intéressant ce nombre à la place d'une chaîne sous VB6... T'es pas sûr que tu te plantes?

Tu n'as pas un équivalent de l'instruction PB PeekS() sous VB6?
Cette instruction retourne une chaîne à partir d'un pointeur.

Publié : mar. 11/août/2009 22:22
par NY152
Il existe objptr(), varptr(), strptr() mais j'ai déjà essayé ça reste un nombre(différent).

Publié : mar. 11/août/2009 23:03
par Ollivier
Sur le forum anglais, un gars qui a VB6 vient de tester ceci et, a priori, ça fonctionne bien chez lui:

Code sous VB6:

Code : Tout sélectionner

Declare Function Test Lib "NomDeLaDLL.DLL" () As String

Sub Main()

    MsgBox Test()

End Sub
DLL PB:

Code : Tout sélectionner

ProcedureDll.I Test()
  ProcedureReturn SysAllocStringByteLen_("MESSAGE DE LA DLL OK", 20)
EndProcedure
T'as pas des réglages particuliers à faire sous VB6?

Publié : mar. 11/août/2009 23:49
par NY152
Ah cette fois j'ai bien le message de la DLL

Pourquoi ça coince dans la DLL, mystère ...

Edit : Après 2/3 tests, c'est bon pour Winamp_InName()

Je pense que maintenant ça va être bon. ^^

Je vais décortiquer le reste et je posterais les résultats demain certainement ^^

En tout cas un grand merci, j'y suis arrivé grâce à toi :)

Publié : mer. 12/août/2009 1:23
par NY152
Je bloque (et le programme aussi lol) sur les fonctions liées aux extensions. De plus les fonctions existantes me pose un gros soucis : elle ne renvois que les extensions du plugin IN chargé donc si on a plusieurs plugins on a aucuns moyens de les connaitre, pire je ne vois pas comment sélectionner le plugin adéquat en fonction de l'extension du média. Mis à part ça, je pense que le code fonctionne normalement (à part 2/3 fonctions non vitales). J'arrête pour ce soir. ^^

Publié : mer. 12/août/2009 2:11
par Ollivier
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.