Création d'une DLL en MASM32 pour un client VB6 [ASM] - ASM - Programmation
Marsh Posté le 17-04-2003 à 11:10:30
Bizarre ton truc
Un test à faire : tu fais un appel à ta dll à partir d'un programme en C, et tu vois si ça fait la même chose. Ca te permettra de tracer les appels beaucoup mieux qu'avec VB je pense, et tu pourras mieux localiser la GPF. Une fois ceci fait, et le pb cerné, tu pourras réutiliser VB.
Moi je vois bien un débordement dans la lecture des 3 premiers paramètres qui sont des chaines. N'oublie pas que VB traite les chaines en Unicode (2 octets donc), il est possible qu'il y ait une merde à ce niveau là.
Essaie d'assembler ta dll sans les chaines pour voir si tu obtiens la GPF.
Marsh Posté le 17-04-2003 à 11:27:13
Je viens d'implémenter une DLL avec une fonction XOR dedans qui retourne une valeur byte, ça marche nickel, donc effectivement, ça doit forcément venir de ces **** de strings comme je le craignais (hey l'unicode j'avais prévu le coup hein, déjà faut être prudent avec CopyMemory )
Je retourne donc à mes expériences pour trouver une solution.
Marsh Posté le 17-04-2003 à 11:33:16
Ce qu'il faut savoir, c'est à quoi correspond le type String en VB.
Si ça correspond à l'adresse de la String, alors ça devrait fonctionner vu que tu attends un DWORD. Par contre, si c'est un alias d'une saloperie de Variant, alors la tu es dans la merde
Marsh Posté le 17-04-2003 à 11:52:13
J'ai fait un second test, je passe une string et la DLL la modifie, ça passe impec également si je spécifie un ByVal pour forcer la conversion d'unicode vers ascii:
Code :
|
Je réessaie sur la DLL, j'ai désactivé le code de la fonction juste pour voir si l'appel se passe sans heurt et VB me sort un Bad DLL calling convention
Je retourne insister
Marsh Posté le 17-04-2003 à 14:18:26
meeeeeeeeeeerde c'est toujours EBX, EBP, ESI, EDI qui servent à l'adressage indexé j'ai 3 chaînes à adresser ça va pas ça
bon je vais faire autrement
Marsh Posté le 19-11-2004 à 14:20:24
Pour utiliser une Dll Masm32 en Vb6 le passage de paramètre string est toujours délicat, il ne faut pas passer les paramêtres en ByRef mais en ByVal et ne pas utiliser Any mais String.
De plus le résultat que tu récupérera dans strBuf finira par le chr$(0) qu'il faudra que tu supprime ensuite si tu veux exploiter correctement
la donnée.
Il faut bien veiller à initialiser strBuf ce que tu a d'ailleurs fais correctement.
Je ne sais pas si ça peut servir vu la date à laquel je répond !
Marsh Posté le 17-04-2003 à 09:25:15
Ne criez pas au sacrilège SVP
J'ai créé une DLL dont le code fonctionne très bien en EXE standalone, il s'agit d'une bête fonction de cryptage de mot de passe. Voici la déclaration:
D'abord les pointeurs vers: un password, un buffer de sortie, une clé de cryptage, la longueur du password, la longueur de clé, et finalement un flag qui dit si on crypte ou décrypte. Les pointeurs sont supposés déjà alloués, sachant que la taille de strPwd est identique à la taille de strBuf sinon ça foire
Je me suis basé sur les exemples fournis avec MASM32, le fichier DEF est on ne peut plus simple également:
Ensuite... la DLL est destinée à être exploitée par une application cliente VB6 dont voici le code complet:
Pour le Declare, je me suis inspiré de l'API CopyMemory qui prend n'importe quoi en entrée et sortie vu que ce sont des pointeurs void. J'ai essayé de remplacé le type Any par String mais le résultat est le même : une belle GPF des familles.
Si vous avez des idées (sauf la corde ), merci d'avance
Message édité par drasche le 17-04-2003 à 09:25:56
---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)