IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Chargement d'une DLL perso mais echec du GetProcAddress


Sujet :

Visual C++

  1. #1
    Candidat au Club
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2011
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Par d�faut Chargement d'une DLL perso mais echec du GetProcAddress
    Bonjour a tous, voyez l'heure tardive a laquelle je vous parle et pour cause, je suis au japon pour l��t�.
    Je suis d�butant en C++, langage que j'ai appris principalement par moi-m�me gr�ce a des tutoriels notamment.

    J'ai pour projet de cr�er une GUI modulable a l'aide de DLL, pour qu'elle puisse g�rer diff�rents types de donn�es. Je n'en suis pas encore la, j'en suis a la d�couverte du chargement dynamique des DLL. (j'ai d�j� r�ussi a en charger par r�f�rence et tout le bazar)

    Et donc mon probl�me est que la biblioth�que est bien charg�e avec le LoadLibrary mais que les deux GetProcAddress cens�s charger les deux fonctions de ma DLL �chouent et me renvoi l'erreur 127 (GetLastError): The specified procedure could not be found. (information pr�cise, utile et pertinente n'est-ce pas -_-")

    Donc, je me suis mis en qu�te un peu partout sur le net et sur ce forum en particulier d'information relative a mon probl�me, j'imagine qu'il y en a, mais bien que j�ai beaucoup cherche je n'ai rien trouve qui colle parfaitement a ma situation alors j'ai d�cide de cr�er un post. Je vous donne le code de ma DLL et la partie de mon main ou je charge la dll pour que vous puissiez m'aider au mieux: (je vous �pargne les commentaires dont mes fichiers sont truffes �tant donne que j'ai construit ces fichiers pour �mailler un tutoriel)

    1stDLL.h (qui est copie dans le r�pertoire de mon programme client)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #ifndef __HEADER__1ST_DLL__ 
    #define __HEADER__1ST_DLL__
     
    #include <windows.h> 
    #include <tchar.h> 
     
    namespace GUIMaker
    {
    	#ifdef  __cplusplus
    		extern "C" {
    	#endif
    	__declspec(dllexport) HWND BuildButton( HINSTANCE hInstance,
    											HWND parent, 
    											TCHAR* text,
    											int msg,
    											int HPos = 0,
    											int VPos = 0, 
    											int bWidth = 100, 
    											int bHeight = 30);
     
    	__declspec(dllexport) HWND BuildWindow( HINSTANCE hInstance, 
    											HWND parent, 
    											TCHAR* title, 
    											DWORD additionalCaract = 0, 
    											int HPos = 100, 
    											int VPos = 0, 
    											int wWidth = 600, 
    											int wHeight = 600);
     
    	#ifdef  __cplusplus
    					}
    	#endif
    }
     
    #endif
    1stDLL.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #include "1stDLL.h"
     
    HWND GUIMaker::BuildButton( HINSTANCE hInstance,
    							HWND parent, 
    							TCHAR* text,
    							int msg,
    							int HPos,
    							int VPos, 
    							int bWidth, 
    							int bHeight)
    {
    	HWND button = CreateWindow( _T("BUTTON"), 
    								text, 
    								WS_VISIBLE | BS_PUSHBUTTON | WS_CHILD, 
    								HPos, 
    								VPos, 
    								bWidth, 
    								bHeight, 
    								parent, 
    								(HMENU)msg,
    								hInstance, 
    								NULL);
     
    	return button;
    }
     
    HWND GUIMaker::BuildWindow( HINSTANCE hInstance, 
    							HWND parent,
    							TCHAR* title,
    							DWORD additionalCaract,
    							int HPos, 
    							int VPos,
    							int wWidth,
    							int wHeight)
    {
     
    	HWND window;
    	if (additionalCaract != 0)
    	{
    	window = CreateWindow(  _T("STATIC"),
    							title,
    							WS_VISIBLE | additionalCaract,
    							HPos,
    							VPos,
    							wWidth,
    							wHeight,
    							parent, 
    							NULL,
    							hInstance,
    							NULL);
    	}
     
    	else window = CreateWindow( _T("MDICLIENT"), 
    								title,
    								WS_VISIBLE | WS_OVERLAPPEDWINDOW,
    								HPos,
    								VPos,
    								wWidth,
    								wHeight,
    								parent,
    								NULL,
    								hInstance,
    								NULL);
     
    	return window;
     
    }
    enfin le bout de code ou j'essaie de charger dynamiquement mes fonctions dans mon fichier Exercise2.cpp (mon fichier MyDLL.dll seul se trouve dans le dossier C:/Windows/sysWOW64/ peut-�tre que �a a son importance)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include "1stDLL.h"
     
    [...]
     
    typedef HWND (CALLBACK* DLLFUNC1)(HINSTANCE, HWND, TCHAR*, DWORD, int, int, int, int); // for BuildWindow function
    typedef HWND (CALLBACK* DLLFUNC2)(HINSTANCE, HWND, TCHAR*, int, int, int, int, int); // for BuildButton function
     
    [...]
     
    	//loading the DLL and its 2 functions
     
    	 DLLFUNC1 DLLFunc1;			// Function pointer for BuildWindow function
    	 DLLFUNC2 DLLFunc2;		    // Function pointer for BuildButton function
     
    	HMODULE hDLL = LoadLibrary( _T("MyDLL.dll") );
     
    	if (hDLL != NULL)
    	{
    	   DLLFunc1 = (DLLFUNC1) GetProcAddress( hDLL, "GUIMaker::BuildWindow");
    	   DLLFunc2 = (DLLFUNC2) GetProcAddress( hDLL, "GUIMaker::BuildButton");
    	   DWORD problem = GetLastError();
     
    	   if (!DLLFunc1)
    	   {
    		  // handle the error
    		  FreeLibrary(hDLL); 
    		  return NULL;
    	   }
    	   if (!DLLFunc2)
    	   {
    		  // handle the error
    		  FreeLibrary(hDLL);       
    		  return NULL;
    	   }
    	   else
    	   {
    		HWND Question = DLLFunc1(   hInstance,
    									hWnd,
    									SURPRISE,
    									WS_CHILD,
    									105,
    									130,
    									300,
    									50);
     
    		HWND YesButton = DLLFunc2(  hInstance, 
    									hWnd,
    									_T("Yes"),
    									WM_YESBUTTON,
    									200,
    									200,
    									100,
    									30);
     
    		FreeLibrary(hDLL);
    		}
     
    	}
    PS: j'ai d�fini WM_YESBUTTON dans mon fichier ressource, idem pour SURPRISE, le probl�me ne vient pas d'eux puisque ce code marche dans un autre projet ou j'ai utilise les r�f�rences pour linker ma DLL

    PS2: pour le code de chargement dynamique je me suis servis de la documentation officielle de VC++ 2010 express sur msdn.microsoft.com/chaipuquoi

    PS3(comme �a j'ai fait toute la famille ^-^): d�sol� pour l'indentation rat�e par le Ctrl+C Ctrl+V j'ai la flemme de la refaire a la main et d�sol� pour le manque d'accent dans mon texte, je travaille sur un clavier Mac et je connais pas les raccourcis

  2. #2
    Candidat au Club
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2011
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Par d�faut
    J'ai une question en particulier, j'ai essaye pas mal de scenario d'erreur (mangling, ...) et ma derni�re id�e en date serait un probl�me venant de la surcharge de mes fonctions alors je voudrais avoir votre avis, est-ce que le fait d'avoir mis des valeurs par d�faut a certains param�tres de mes fonctions peut avoir fait foirer le GetProcAddress puisqu'il y aurait alors plusieurs fonctions avec le m�me non ?

    EDIT: j'ai essaye en modifiant .h et .cpp de MyDLL pour n'avoir plus que des fonctions non surcharg�es et �a ne marche pas non plus

  3. #3
    Candidat au Club
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2011
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Par d�faut
    Bon, apr�s une petite demi-douzaine d'heure(plus toute la journ�e d'hier a peu pr�s -_-) pass�es sur le probl�me, j'ai trouve une solution:

    -ne plus utiliser de namespace (�a marche avec mais en appelant la fonction sans le pr�fixe du namespace et je ne sais pas pourquoi donc par prudence je ne l'utilise plus)(mais je veux bien une explication si qqn en connait une)

    -ne plus surcharger les fonctions (la aussi �a marche et je ne sais pas pourquoi)(idem pour l'explication je suis preneur)

    -mais SURTOUT j'ai change la d�claration de mes pointeurs r�cup�rant les fonctions de la DLL avec le pr�fixe __cdelc car apparemment le probl�me venait du fait qu��tant d�clares en __stdcall et vu le nombre et la taille des param�tr�s en entr�e des fonctions de la DLL, d�passant la taille pr�vue par le __stdcall, le compileur a corrige de lui-m�me implicitement la d�claration des fonctions dans la DLL en tant que __cdelc et mes pointeurs �tant d�clar�s en tant que __stdcall, ils �taient incompatibles et cela provoquait l'erreur:
    The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
    (NDR: j'ai trouve cette erreur apr�s avoir supprime le namespace ET conjointement la surcharge de fonction)(Merci Google pour m'avoir souffle la solution)

    code du client: (je vous laisse le soin d'imaginer les changements tr�s simples du .h de la DLL)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    // Declaration of the DLL exported function type
    typedef HWND (CDECL* DLLFUNC1)(HINSTANCE, HWND, TCHAR*, int, int, int, int, int); // for BuildButton function
    typedef HWND (CDECL* DLLFUNC2)(HINSTANCE, HWND, TCHAR*, DWORD, int, int, int, int); // for BuildWindow function

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [VB] Probl�me de chargement d'une DLL
    Par Elijha dans le forum Windows Forms
    R�ponses: 3
    Dernier message: 10/05/2006, 09h24
  2. Chargement d'une DLL
    Par olive_le_malin dans le forum MFC
    R�ponses: 15
    Dernier message: 16/12/2005, 17h09
  3. R�ponses: 4
    Dernier message: 03/11/2005, 13h57
  4. Contexte de chargement d'une DLL
    Par Guillemot dans le forum Windows
    R�ponses: 2
    Dernier message: 10/07/2005, 09h34
  5. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    R�ponses: 6
    Dernier message: 07/09/2004, 23h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo