Dll + LoadLibrary

cs_Manson Messages postés 137 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 30 septembre 2004 - 23 sept. 2003 à 12:27
cs_Manson Messages postés 137 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 30 septembre 2004 - 23 sept. 2003 à 14:09
Salut,

voila, j'ai fais une dll dont le code est le suivant :

void __declspec(dllexport)show_msg(HWND hWnd, char *msg)
{
MessageBox(hWnd, msg, "Dll Powa - Yeah !", MB_OK);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

La compilation se fait tres bien. Dans mon programme maintenant je fais ceci :

typedef void (*MYPROC)(HWND hWnd, char *msg);
HMODULE dll;
MYPROC show_msg;

dll = LoadLibrary("test_dll.dll");
if (dll == NULL)
MessageBox(NULL, "Can't load library", "Error", MB_OK);
else
{
show_msg = (MYPROC)GetProcAddress(dll, "show_msg");
if (show_msg == NULL)
{
error = GetLastError();
sprintf(msg, "Error code : %lu", error);
MessageBox(NULL, msg, "Error", MB_OK);
}
else
(show_msg)(hWnd, "Ceci est un test :)");
FreeLibrary(dll);
}

J'ai toujours le code 127 comme erreure. Je ne comprend pas pourquoi.

Si vous trouvez l'erreure ou que vous avez un conseil.

D'avance merci.

Rno

10 réponses

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
23 sept. 2003 à 12:39
C'est quoi au juste, ce code 127 ?

Essaie plutot :
typedef void WINAPI (MYPROC)(HWND,char*)


Pour définir le type de ta procédure.

A+
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
23 sept. 2003 à 12:47
Je viens de compiler et d'exécuter ton code sans aucun problème, et sans rien modifier. Peux tu m'en dire plus ?

PS: ne tiens pas compte de la remarque précédente, c'est juste que je ne gère pas les pointeurs de fonctions de la même manière que toi.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
23 sept. 2003 à 13:04
Salut,
Pour info si ca peut vous aider:
Erreur 127: " La procédure spécifiée est introuvable. "
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
23 sept. 2003 à 13:11
Ah...

C'est donc que le compilateur a "décoré" le nom de la procédure dans la DLL avec des underscores ou un @xxx

Dumpe les exports de ta DLL et regarde si tu vois un nom comme _show_msg ou __show_msg ou show_msg@xxx (je suppose que ce sera show_msg@8, vu le type des paramètres de show_msg).

Quel compilateur utilises tu ? Il y a surement moyen de désactiver cela. Pour GCC, teste :
gcc -Wall -W toto_dll.c -mdll -o toto.dll -Wl,--kill-at


Pour MSVC, je sais pas.

A+
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 sept. 2003 à 13:16
extern "C" void __stdcall show_msg(HWND hWnd, char *msg)
{
code ici de la dll;
}

FICHIER nomdll.def a inclure dans projet:
LIBRARY nomDll
EXPORTS
show_msg

Devrait aller mieux, le nom ne sera plus decore.
Et mets bien __stdcall dans la declaration du prog appelant.
BruNews, ciao...
0
cs_Manson Messages postés 137 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 30 septembre 2004
23 sept. 2003 à 13:53
Euh ... j'ai fais tout ce que vous avez dit, mais ca ne marche toujours pas.

J'ai fais le fichier test_dll.def, mais rien. Ca ne marche toujours pas j'ai le code 127.

Je compile avec .NET.

Voici mon code apres les modifs pour la DLL :
extern "C" void __stdcall show_msg(HWND hWnd, char *msg)
{
MessageBox(hWnd, msg, "Dll Powa - Yeah !", MB_OK);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call) 
    { 
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

avec le fichier def :
LIBRARY	test_dll
EXPORTS
show_msg

et le code du prog appelant :
typedef void (__stdcall *MYPROC)(HWND hWnd, char *msg); 
HMODULE	dll;
MYPROC	show_msg;
[...]
dll = LoadLibrary("test_dll.dll");
if (dll == NULL)
MessageBox(NULL, "Can't load library", "Error", MB_OK);
else
{
show_msg = (MYPROC)GetProcAddress(dll, "test_bordel_de_merde");
if (show_msg == NULL)
{
error = GetLastError();
sprintf(msg, "Error code : %lu", error);
MessageBox(NULL, msg, "Error", MB_OK);
}
else
(show_msg)(hWnd, "Ceci est un test :)");
FreeLibrary(dll);
}
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
23 sept. 2003 à 13:58
show_msg = (MYPROC)GetProcAddress(dll, "test_bordel_de_merde");


Normal...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 sept. 2003 à 13:58
show_msg = (MYPROC)GetProcAddress(dll, "show_msg");
BruNews, ciao...
0
cs_Manson Messages postés 137 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 30 septembre 2004
23 sept. 2003 à 13:59
[..]
show_msg =  (MYPROC)GetProcAddress (dll, "test_bordel_de_merde"); 
if (show_msg  == NULL)
[...]


C'est pas le bon nom de fonction (j'etais un peu enerve
que ca marche pas.) Maintenant ca marche nickel.

Grand merci a tous.

Rno
0
cs_Manson Messages postés 137 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 30 septembre 2004
23 sept. 2003 à 14:09
Wow, vous repondez super vite.

Grand merci pour votre aide.

Rno
0
Rejoignez-nous