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 :
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:\...\BCC55\LIB\C0X32.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
bcc55\lib\ 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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jean-Claude BELLAMY
Le mardi 01/03/2011 12:04:33, Roger a écrit dans le message <news:4d6cd227$0$5424$ ce qui suit :
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 :
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
Le mardi 01/03/2011 12:04:33, Roger a écrit dans le message
<news:4d6cd227$0$5424$ba4acef3@reader.news.orange.fr> ce qui suit :
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 :
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
Le mardi 01/03/2011 12:04:33, Roger a écrit dans le message <news:4d6cd227$0$5424$ ce qui suit :
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 :
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
"Jean-Claude BELLAMY" a écrit dans le message de news: 4d6cf993$0$7679$
Le mardi 01/03/2011 12:04:33, Roger a écrit dans le message <news:4d6cd227$0$5424$ ce qui suit : ---------------------------------------------------------- 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):
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.
"Jean-Claude BELLAMY" <Jean-Claude.Bellamy@wanadoo.fr> a écrit dans le
message de news: 4d6cf993$0$7679$ba4acef3@reader.news.orange.fr...
Le mardi 01/03/2011 12:04:33, Roger a écrit dans le message
<news:4d6cd227$0$5424$ba4acef3@reader.news.orange.fr> ce qui suit :
----------------------------------------------------------
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):
"Jean-Claude BELLAMY" a écrit dans le message de news: 4d6cf993$0$7679$
Le mardi 01/03/2011 12:04:33, Roger a écrit dans le message <news:4d6cd227$0$5424$ ce qui suit : ---------------------------------------------------------- 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):