problème de dll en C++

Le
Roger
Bonjour,

J'essaie depuis plusieurs jours de faire marcher une dll qui utilise l'API32
sous Windows XP. Je compile avec Borland C/C++ compiler sans erreur de
compilation et avec :

bcc32.exe -Twd -c Mydll.cpp

puis je linke avec ilink32 sans erreur de linkage et avec :

ilink32.exe -aa c0d32 /Tpd Mydll.obj,,import32 cw32

J'obtiens bien un fichier Mydll.dll

Mais quand j'essaie de le lancer avec rundll32.exe Mydll,Entrypoint

J'ai systématiquement le message suivant :

«RUNDLL entrée manquante : Entrypoint»

Dans le source de ma dll j'ai la forme suivante :

DWORD WINAPI Entrypoint(LPVOID lpParameter)

{

corps de ma dll

}

puis plus loin:

BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)

{

n0instThread=hInst;

return TRUE;

}

J'ai essayé aussi de faire: rundll32.exe Mydll,DllMain

Dans ce cas j'ai : «RUNDLL entrée manquante : DllMain»

J'ai essayé aussi de supprimer du source la fonction DllMain et de remplacer
la fonction point d'entrée par :

BOOL WINAPI Entrypoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID
lpvReserved ){corps de la dll}

Même erreur avec rundll !

Dans le linkage, j'ai essayé de remplacer c0d32 par: c0d32w, puis par:
c0d32x, puis par: c0s32, toujours pas d'erreur de linkage, mais même erreur
avec rundll.

A noter par ailleurs comme deuxième point mais c'est moins important que je
n'ai jamais réussi à faire une compilation avec production directe du dll :
si j'enlève le paramètre «-c» de la ligne :

Bcc32.exe, j'obtiens systématiquement l'erreur de linkage suivante :

Unresolved external '_main' referenced from C:\BCC55LIBC0X32.OBJ,

J'ai essayé de rajouter plusieurs paramètres dont : -DBUILD_DLL
ou -DBUILD_DLL_export, de rajouter aussi le paramètre -L avec plusieurs
librairies (dont c0x32), j'ai toujours la même erreur de linkage avec bcc32.

Enfin, concernant le premier point j'ai vu un message sur ce site dans
lequel dj.motte dit d'utiliser :

COD32DYN.OBJ comme fichier de démarrage, or ce fichier ne figure pas dans
bcc55lib enfin dj.motte dit aussi pour des raisons de compatibilité d'utiliser
: BOOL __stdcall _export strToLdouble( LPCSTR z, long double * val ); outre
le fait que je ne comprends pas ce que ça fait, je ne vois pas où il faut le
mettre et en plus la fonction strToLdouble n'est pas reconnue par le
compilateur.

Si quelqu'un pouvait m'aider essentiellement sur le 1er point, ça serait
sympa.

Merci

Cordialement,
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Claude BELLAMY
Le #23167031
Le mardi 01/03/2011 12:04:33, Roger a écrit dans le message
Bonjour,

J'essaie depuis plusieurs jours de faire marcher une dll qui utilise l'API32
sous Windows XP. Je compile avec Borland C/C++ compiler sans erreur de
compilation et avec :

bcc32.exe -Twd -c Mydll.cpp

puis je linke avec ilink32 sans erreur de linkage et avec :

ilink32.exe -aa c0d32 /Tpd Mydll.obj,,import32 cw32

J'obtiens bien un fichier Mydll.dll

Mais quand j'essaie de le lancer avec rundll32.exe Mydll,Entrypoint

J'ai systématiquement le message suivant :

«RUNDLL entrée manquante : Entrypoint»

Dans le source de ma dll j'ai la forme suivante :

DWORD WINAPI Entrypoint(LPVOID lpParameter)
[...]

puis plus loin:

BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
[...]

J'ai essayé aussi de faire: rundll32.exe Mydll,DllMain

Dans ce cas j'ai : «RUNDLL entrée manquante : DllMain»

J'ai essayé aussi de supprimer du source la fonction DllMain et de remplacer
la fonction point d'entrée par :

BOOL WINAPI Entrypoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID
lpvReserved ){corps de la dll}
[...]



J'ai repris un article que j'avais écrit il y a 10 ans, mais il doit
toujours être valable :

La syntaxe de RUNDLL32 est la suivante :

RUNDLL32.EXE <nom_de_dll>,<point_d_entree> <arguments optionels>


1)nom_de_dll
------------
Comporte ou non le chemin complet de la DLL (tout dépend de sa
localisation, si son répertoire fait partie ou non de la variable
d'environnement PATH)


ATTENTION : pour éviter tout pb, ce nom doit être le NOM COURT !!!
Aucun espace ou caractère "folklo" n'est autorisé !
p.ex. , si on veut appeller la DLL suivante
D:Program FilesMicrosoft OfficeOfficeautoclip.dll
il faudra taper (p.ex.) :
rundll32 d:PROGRA~1MICROS~1OFFICEautoclip.dll,ACBeginSearch


2)La VIRGULE
------------
Placée entre le nom de la dll et le point d'entrée, elle est TRES
IMPORTANTE. Elle doit être "collée" entre eux, sans aucun espace.


3)Le point d'entrée
-------------------
C'est le nom de la fonction appelée dans la DLL.
Ces noms de fonctions sont communément désignés sous
l'appellation d'API.


Prototype de cette fonction en 32 bits :

void CALLBACK
point_d_entree(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine,
int nCmdShow);


Paramètres du point d'entrée de la DLL
===================================== hwnd : handle de fenêtre propriétaire des autres fenêtres
de la DLL
hinst : handle d'instance de la DLL
lpszCmdLine : chaine ASCIIZ de paramètres
nCmdShow : flag d'affichage des fenêtres éventuelles

--

May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP Expert IT Pro]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
Roger
Le #23167181
"Jean-Claude BELLAMY" message de news: 4d6cf993$0$7679$
Le mardi 01/03/2011 12:04:33, Roger a écrit dans le message
----------------------------------------------------------
Jean-Claude BELLAMY [MVP Expert IT Pro]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr

Merci pour ta réponse, j'ai bien noté ce que tu dis, mais, a priori, ça ne
venait pas de là, il est vrai que dans mon explication j'avais fait simple
pour la compréhension mais j'avais bien mis le chemin complet de la DLL,
quant à l'espace après la virgule j'avais déjà tout essayé (avec et sans).
J'ai bien une fonction Callback, mais celle-ci n'est pas le point d'entrée
de la DLL, elle fait partie du corps de la DLL pour répondre à un Hook. Par
contre, j'ai réussi à faire marcher ma DLL de la manière ci-dessous:



J'ai juste rajouté «extern "C" __declspec(dllexport) » devant la fonction
point d'entrée contenant le corps de la DLL, je suppose que ceci permet au
compilateur et au linker de reconnaître le point d'entrée comme une
référence externe à la procédure (ce qui est bizarre c'est que je n'ai rien
trouvé qui l'indiquait dans la doc de C++ builder, c'est en parcourant le
net que j'ai trouvé un exemple différent mais qui m'a fait essayer):



extern "C" __declspec(dllexport) DWORD WINAPI Entrypoint(LPVOID lpParameter)

{

corps de ma dll

}



avec toujours plus loin:



BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)

{

n0instThread=hInst;

return TRUE;

}



et ça marche !!! le Rundll32.exe Mydll, Entrypoint me lance bien ma dll



Mais je me pose toujours la question suivante : ma solution est-elle propre
ou y a-t-il des trucs inutiles ?

Autre question : je n'ai toujours pas résolu le compile avec linkage direct
de bcc32 ?



Merci pour vos réponses
R.G.
Publicité
Poster une réponse
Anonyme