Pb d'appel de fonctions (DLL en linkage dynamique)

Signaler
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
-
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
-
Bonsoir all,

Je souhaiterai faire un appel de fonction définie dans un fichier .DLL de manière dynamque etc...jusque la pas de pb, mais je en comprend pas pourquoi le prog ne trouve pas la fonction!! :(

/* code dans le .cpp de la dll... */
#define DLLEXPORT __declspec (dllexport)

bool DLLEXPORT EncodeToDff(char* fichier, char* dest) {

//instructions 
}

/* dans mon programme... */
     case WM_PAINT:
         
         HINSTANCE hDll;
         hDll = LoadLibrary("DffEncoding.dll");
         
         typedef bool (_stdcall* ENCODE) (char*, char*);
         
         ENCODE pEncode;
         pEncode = (ENCODE) GetProcAddress(hDll, "EncodeToDff");
         
         if (pEncode)
          (pEncode)("fond.bmp", "fond.dff");  // retourne TOUJOURS 0! :(


Voila, pEncode vaut toujours 0....comme si le nom de la fonction n'était pas le bon :s je en sais pas quoi faire....:|

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))

14 réponses

Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
que vaut hDll ? (NULL ?)

une question : pourquoi faire tout cela dans le WM_PAINT, il suffit de le faire dans le WM_CREATE et de stocker une bonne fois pour tout pEncode dasn une variable.

Pourquoi faire simple quand on peut faire compliquer ?
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Bon, on va reprendre point par point :

Numéro1, je ne suis pas suffisamment stupide pour ne pas tester la valeur de hDll et venir poster ici en demandant de l'aide! Oui, pour répondre à ta question, j'ai vérifié, et hDll n'est pas égal à NULL!

Numéro 2, j'utilise une dialogbox, donc ton message WM_CREATE.....tu vois, tu peux te le garder....(j'ai fait avec WM_INITDIALOG et cela n'a rien changé pour info)

Numéro3, je ne comprend en rien ta phrase, ou plutot ta critique "Pourquoi faire simple quand on peut faire compliquer ?" <<< explique moi où est le compliqué dans ce code et surtout, donne moi voir la méthode facile, si d'après toi il y en a une!

Voila, sur ce je pourrais ajouter un numéro 4 : tu as le droit de parler sans agressivité, je ne suis pas ton chien, si tu n'as pas envie de m'aider, ne poste pas tes messages tes messages pourris qui n'avancent à rien....

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Gendal67 > faudrait repondre aux gens de maniere courtoise, JCDjcd ne t'a en rien agresse. Sa derniere ligne est d'un usage tout ce qu'il y a de sympa.

ciao...
BruNews, MVP VC++
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
bon puisque que tu le prend ainsi ...
je ne comprends pas en quoi je suis agressive ...
et pour ta gourverne la derniere phrase n'etait pas pour toi, mais c mon "slogan", car j'aime cette phrase, mais au fait tu m'insulte en ecrivant : "Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))"

j'essayais juste de comrpend le Pb, ce qui est le but de la question, et comme je ne suis pas devin, je ne devine pas pour quelle bonne raison cela vaut NULL.

Pour finir comme tu n'es pas stupide, tu iras surement regarder la doc de la fonction GetProcAddress pour savoir quel genre d'erreur tu as commis (mauvais argument de la fonction). Et puis il reste un derniere solution, quelle est l'erreur systeme ? (GetLastError... (j'espere que je ne t'es pas offense en rapellant le nom de cette fonction))

((((((((((Pourquoi faire simple quand on peut faire compliquer ?)))))))))) <<<< ATTENTION

:)
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Bon, et sinon, pour le vif du sujet, je fais quoi ? nan, ça a l'air de coller pour la fonction....moi je c pu quoi faire....j'ai essayé avec EncodeToDffW, EncodeToDffA, EncodeToDffAW, ....:s

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
tu as essaye les librairie Dll juste dans un WinMain, sans de fenetre, pour voir si ca marchait ?
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Oui, en fait, lol, j'ai eu justement cette idée! lol, je viens à l'instant de finir....voila le code...mais bon, ça ne marche pas +....:(


#include <windows.h>

HINSTANCE hInst, hDll;

typedef bool (*ENCODE) (char*, char*);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
 
  hInst = hInstance;
  
  hDll = (HINSTANCE) LoadLibrary("DffEncoding.dll");
  
  if(!hDll) {
        
    MessageBox(0, "Impossible de charger la librairie", "Erreur au chargement", 0);
    return 1;
   }
   
  ENCODE pEncode;
  pEncode = (ENCODE) GetProcAddress(hDll, "EncodeToDff");
  
  if(!pEncode) {
   
    MessageBox(0, "Fonction non trouvée", "Fonction manquante", 0);
    return 1;     
   }
   
  (pEncode) ("D:\\file.bmp", "D:\\file.dff");   
 }


pEncode vaut toujours 0....

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Euh, je ne sais pas pk, mais cela peut-il venir d'une mauvaise exportation de la fonction de la DLL ?

voici le code dans la DLL...(dans le fichier .cpp de la DLL)

bool DLLEXPORT EncodeToDff(char* fichier, char* dest);

BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) {
    
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }
    
 return TRUE;
}

bool DLLEXPORT EncodeToDff(char* fichier, char* dest) {

//instructions

 }


Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

En regardant dans le fichier .def de ma dll, j'ai trouvé ceci :

_Z11EncodeToDffPcS_ @ 3 ; EncodeToDff(char*, char*)

J'ai compris qu'on peut utiliser le cardinal (le truc de gauche ?)..mais cela ne marche tjs pas...... :s

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
ca donne quoi le GetLastError ?

Pourquoi faire simple quand on peut faire compliquer ?
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

ça donne l'erreur 127 qui sur msdn est décrite par :

127 The specified procedure could not be found. ERROR_PROC_NOT_FOUND

Je ne comprends pas....j'ai même essayé avec d'autres de mes fonctions...ça ne marche pas nan plu...t'es sur qu'il n'y a pas qqch de faux dans mon code ci avant ?? sur, ça doit etre un truc tout bete, mais dur a déceler, ça c'est sur ^^

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Oui, j'ai trouvé!!!!!! Merci BruNews, j'ai trouvé ton aide sur une source (tu répondais à un gar squi avait eu le même problême) :
il fallait juste mettre ce extern "C" { } <<< J'ai cherché des heures pour si simple!!! La perte de temps, je vous dis pas:s

En tt cas, merci à toi BruNews pr ta réponse et JCDjcd pour ton aide! :-)

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
tu as un logiciel de lecture des Dll ? car tu peux voir ce qu'il y a dedans, et si ta fonction n'y est pas, cela expliquerais beaucoup de choses. Tu as deja reussi a faire fonctionner un Dll, avec un exemple simple, pour pouvoir comparer.

Sinon a propos de GetLastError, cette fonction est tres utile, je te conseillerais de te faire un bonne fois pour toute un fonction que d'ecrit l'erreur systeme (sans que tu de derange a aller chercher le texte correpondant sur MSDN). Il faut utiliser FormatMessage

Voici un bout de code pour mettre le message dans un buffer ( apres tu l'affiches ou tu veux)
********************************************
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),buf,255,NULL);
**********************************************

Pourquoi faire simple quand on peut faire compliquer ?
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
Bon je suis trop lent, tout vas trop vite pout moi :(
Bon ben tant pis, l'affaire est resolu (tant mieux) !

Bonne continuation !

Pourquoi faire simple quand on peut faire compliquer ?