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

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 27 déc. 2004 à 19:38
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 27 déc. 2004 à 23:45
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

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
27 déc. 2004 à 20:01
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 ?
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
27 déc. 2004 à 21:00
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!! :-))
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 déc. 2004 à 21:11
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++
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
27 déc. 2004 à 21:12
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

:)
0

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

Posez votre question
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
27 déc. 2004 à 21:29
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!! :-))
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
27 déc. 2004 à 22:00
tu as essaye les librairie Dll juste dans un WinMain, sans de fenetre, pour voir si ca marchait ?
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
27 déc. 2004 à 22:12
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!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
27 déc. 2004 à 22:15
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!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
27 déc. 2004 à 22:34
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!! :-))
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
27 déc. 2004 à 23:04
ca donne quoi le GetLastError ?

Pourquoi faire simple quand on peut faire compliquer ?
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
27 déc. 2004 à 23:31
ç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!! :-))
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
27 déc. 2004 à 23:43
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!! :-))
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
27 déc. 2004 à 23:44
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 ?
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
27 déc. 2004 à 23:45
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 ?
0
Rejoignez-nous