draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010
-
7 mai 2007 à 17:54
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010
-
14 mai 2007 à 00:37
Salut a tous,
J'essai de faire une dll en C pour utiliser sous vb6, mais je recois toujours le message "Bad dll Calling Convention" depuis vb6 :(
Voici un exemple simple pour montrer comment je 'y prends:
Il y a un template tout prêt pour DLL Réglages sont mis en compil C et export stdcall comme il se doit. Faudra copier le def qui est dans le dossier template dans le dossier de ton proj.
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 7 mai 2007 à 22:17
Salut BruNews,
Merci beaucoup :)
Mais je dois avouer que j'ai pas trop compris le fonctionnement de ton "prog"
En fait j'ai pris le template j'ai mis ma fonction dedans j'ai ajouter le .def comme indiquer dans le fichier X1.cpp et j'ai du ajouter le nom de la fonction en dessous de Export dans le fichier .def
Au final ca marche impec, mais j'ai pas compris le system de template pour automatiser ca...
Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 13 mai 2007 à 20:42
Re,
J'ai un gros soucis avec memset
si je mets un memset tout ce compile normalement sans erreur ni warning
mais lorsque je veux utiliser la dll depuis vb6 il me met que ma dll est introuvable :(
c'est bizarre comme erreur non ?
ma dll est toujours dans le system32 et elle fonctionne tres bien si j'enleve le memset...
J'ai pensé a un include manquant mais le compilo devrait me prevenir dans ce cas non ?
Aussi le message d'erreur de Vb devrait etre du genre "cant load library" ou "cant find entry point" mais "dll introuvable" je sais pas dutout ou il va chercher ca...
une idée peut etre ?
Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 mai 2007 à 21:24
Attends, je vais compiler et voir si j'ai le prob.
Pour info:
rep movsb, à bannir sur les processeurs modernes, trop lent.
memset, tu es certain que c'est ce que tu veux ??? En tout cas, faut éviter les routines CRT quand on fait un point d'entrée perso, c'est justement pour s'en passer.
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 13 mai 2007 à 21:33
"rep movsb, à bannir sur les processeurs modernes, trop lent."
Eh merci pour l'info :) mais tu remplace par quoi alors ?
"memset, tu es certain que c'est ce que tu veux ??? "
eh bin ce serait pour creer un buffer en passant un StrPtr(MaString) depuis vb
j'imagine d'apres ta remarque que c'est pas la meilleur solution...
Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 mai 2007 à 22:13
Autre chose:
Ton MovMem() est SUPER DANGEREUX.
Imagine Addr(B) est 1004, Addr(A) est 1000
MovMem() de A vers b sur len=12
Bingo, on a écrasé l'original de A à partir du 5eme octet AVANT de copier.
memmove() original du CRT tient compte de cela bien entendu.
Faut tester si overlapp des buffers, on ira soit en incrémentant les pointeurs soit partant du haut et décrémenter.
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 13 mai 2007 à 22:29
ok merci beaucoup pour ces indications pour le code asm :)
c'est un code copié d'une source d'EB, je l'ai tester et ca marchait sans problemes donc je l'ai garder...
mais je comprend pas trop en fait, si Addr(B) est 1004 et Addr(A) est 1000
alors Addr(A) ne peut pas etre plus long que 4 si ? donc si je mets un len 12 ca plantera dans tous les cas non ? tout comme avec RtlMoveMem ou bien j'ai rien compris ?
Sinon pour la fonction MakeBuff je suis arrive a ceci en m'inspirant d'une de tes sources:
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 13 mai 2007 à 23:29
Eh bin je vais faire quelques tests bien que je te crois tout a fait, je comprends pas trop, quelques boucles m'aideront surement a comprendre...
sinon au fait un dernier ptit truc, est-ce normal que ceci:
BSTR MakeBuff (
long llen)
{
return SysAllocStringByteLen(NULL, llen );
}
soit 8 fois plus lent qu'un Space() de vb ?
Y a t'il pas une autre methode pour allouer un BSTR ? car vb est deja lent pour allouer mais la c'est vraiment tres lent je veux bien que l'appel a la dll prenne du temps mais pas a ce point!
Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 mai 2007 à 23:51
Mais si c'est le chargement et localisation de la fonction dans la DLL qui fait la lenteur.
Declare etc... de VB ne produit pas un linkage static, chargement et adreese fonction ne sont trouvés qu'au 1er appel. La fonction VB est par contre linkée en static à la compilation.
déroulons la boucle, simple à cmprendre:
vals(4) = vals(2)
vals(5) = vals(3)
vals(6) = vals(4)
he he, vals(4) a été réécrit avant, valeur erronée.
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 14 mai 2007 à 00:37
erf en effet, je ne l'avais pas encore mis dans une tlb contrairement a mes autres fonctions....
Effectivement ca va beaucoup plus vite now! je ne m'attendais pas a une telle difference!
Sinon pour le MovMem ok je vois, mais ceci uniquement si je copie d'un tableau vers un meme tableau alors ?
Enfin de toutes facons je vais utiliser ta methode comme ca je suis certain de ne pas faire d'erreur.
Merci vraiment pour tout!
++
Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...