Dll pour vb6

Résolu
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010 - 7 mai 2007 à 17:54
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 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:

Code C

#include <windows.h>


#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT
#endif


long DLL_EXPORT Div(long a, long b);


long DLL_EXPORT Div(long a, long b)
{


    return (a / b);
}


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    return TRUE; // succesful
}

Declaration Vb:
Private Declare Function Div Lib "sample.dll" (ByVal a As Long, ByVal b as long) As Long

Pour info j'utilises Code Blocks avec GCC mais j'ai tester avec Visual studio 2005 et j'ai les memes erreurs...

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...

19 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 mai 2007 à 20:55
VC++ 2005:
Utilise ceci:
http://www.cppfrance.com/code.aspx?ID=36940

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.

ciao...
BruNews, MVP VC++
3
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 mai 2007 à 22:22
Le prog template ne crée que le projet muni d'un fichier cpp avec les bons réglages compilo.
Le def est à mettre à la main.

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
7 mai 2007 à 22:28
Erf c'est bon j'ai compris! je m'etais un peu perdu dans tous ces fichers, j'avais pas reussi a executer le prog lol

Encore merci ^^

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mai 2007 à 20:49
hein....
Gros ce code ? sinon fais voir.

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
13 mai 2007 à 21:00
non c'est juste quelques ptites fonctions pour apprendre un peu et pour tenter d'optimiser quelques fonctions de Vb



#define



_WIN32_WINNT 0x0501


#define
_WIN32_IE 0x0501


#include



<windows.h>

HINSTANCE thismod = 0;





#pragma






comment
(linker,

"/entry:myDllMain"
)


__declspec



(

naked
)

int



__stdcall
myDllMain(HINSTANCE hdll, DWORD dwReason, LPVOID Reserved){


// DLL_PROCESS_DETACH 0, DLL_PROCESS_ATTACH 1






__asm
{
mov eax, [esp+8] ; dwReason
mov edx, [esp+4] ; hdll
dec eax


//js short processDETACH

jne

short
mainRET
push edx
mov thismod, edx
call dword ptr DisableThreadLibraryCalls


//jmp short mainRET
//processDETACH:

mainRET:
mov eax, 1
ret 12
}

}


#ifdef
__cplusplus


extern



"C"
{


#endif


/* FONCTIONS EXPORTEES ICI */

void



Div (

long
* a ,

long
b ) ;


long
Increment (

long
a ,

long
llen ) ;


void
Decrement (

long
* a ,

long
llen ) ;


long
MovMem (

long
a ,

long
b ,

long
c ) ;


void
MakeBuff (

long
* a ,

long
llen ) ;


__declspec



(

naked
)

long
Increment(

long
a,

long
b)
{


__asm
{
mov eax, [esp+8]
add eax, [esp+4]
ret 8
}}



void



Decrement (

long
* a,

long
b)
{
*a -= b;
}


void



Div(

long
* a,

long
b)
{
*a /= b;
}


__declspec



(

naked
)

long
MovMem(

long
a,

long
b,

long
c){


__asm
{
push edi
push esi
mov edi,[esp+12]
mov esi,[esp+16]
mov ecx,[esp+20]
rep movsb
pop esi
pop edi
ret 12
}}



void



MakeBuff (

long
* a,

long
b) {


  memset(a, 32, b);


//*a = *a / b;

}

#ifdef



__cplusplus
}


#endif




Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mai 2007 à 21:46
Boucle à décrémentation manuelle
memMOV:
mov al, [addr1]
mov [addr2], al
....
sub ecx, 1
jnz short memMOV

"Créer" un buffer ou remplir d'une certaine valeur ???
Créer String c'est SysAllocString(xxx).

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mai 2007 à 21:48
Donc comme prévu, memset crée une dépendance sur msvcr80.dll, à exclure absolument.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 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:

void MakeBuff (BSTR* a,
long b)
{

char *pmem = 0;
pmem = (
char*) HeapAlloc(GetProcessHeap(), 0, b );

if(pmem) {

if(a) SysFreeString(*a);
*a = SysAllocStringByteLen(pmem, b );

if(pmem) HeapFree(GetProcessHeap(), 0, pmem)
}
}

Apparement ca marche impec mais est-ce vraiment le chemin le plus court ?

En tout cas merci beaucoup pour le probleme de memset car je pense que j'aurais pu chercher encore longtemps...

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mai 2007 à 22:43
ne peut pas être plus long que 4 si tu parles de String mais si tu passes adresses de tableaux ???

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
13 mai 2007 à 23:09
Eh tu veux dire que les tableau ne sont pas contigus ?  que MonTableauDeLong(0) peut etre en 1004 et MonTableauDeLong(1) en 2018 par exemple ?

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mai 2007 à 23:15
mais non, imagine:

Dim vals(200) As Byte
ce tableau a été rempli de valeurs.
Now on voudrait copier 10 valeurs depuis vals(2) vers vals(4).

he he, valeurs écrasées à partir du 3eme octet.

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 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...
0
Rejoignez-nous