Retrouver le hmodule d'une dll [Résolu]

Signaler
Messages postés
116
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
13 février 2008
-
Messages postés
116
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
13 février 2008
-
Bonjour, je créé actuellement une DLL sous VC++, je dois charger une image en ressource dans cette dll avec
hbitmap=(HBITMAP) LoadImage(hInst,"CP_BGBITMAP",IMAGE_BITMAP,0,0|LR_CREATEDIBSECTION);

le problème c'est que je n'arrive pas à retrouver le hInst (ou hmodule) de ma dll.

Un : hInst=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
ou hInst=GetLastInstance();
me donne le handle de l'exe qui a chargé ma dll, donc le système ne trouve pas l'image dans l'exe c'est normal.

Comment retrouver le hmodule, de ma dll ?

http://www.rc-bot.com/bannieres/banniere468x60.jpg

11 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Remplace LoadLibrary par GetModuleHandle

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Enregistre le hmodule dans DllMain().

ciao...
BruNews, MVP VC++
Messages postés
116
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
13 février 2008

Je développe un pilote, ma fonction DLLMain n'est pas implémenté, je n'ai que DllEntryPoint (HINSTANCE hInstance,ULONG ulReason,LPVOID pv)

et quand je réutilise ma hInstance reçue dans LoadImage(hInstance,"CP_BGBITMAP",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION); , je retombe sur l'instance du programme qui lance ma dll, et donc je n'arrive pas à charger ma ressource depuis ma dll.

Je ne suis pas censé connaitre le dossier où se trouve ma dll (dépend d'ou l'utilisateur aura installé celle-ci). GetModuleFileName(NULL,str,MAX_PATH); me donne le nom de l'exe host, donc je me sens un peu coincé pour retrouver ma bitmap en ressource.

Une idée ?

http://www.rc-bot.com/bannieres/banniere468x60.jpg
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
DllEntryPoint est autre nom de DllMain.

HINSTANCE thismod;

DllEntryPoint(HINSTANCE hInstance,...)
{  if(ulReason DLL_PROCESS_ATTACH) thismod hInstance;
  return 1;
}

ciao...
BruNews, MVP VC++
Messages postés
116
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
13 février 2008

Oui, j'avais réussi à retrouver cette instance en la sauvegardant lors de l'appel de DllEntryPoint mais si je fait un getmodulefilename sur thismod j'obtient le nom de l'exe et non de ma dll. Mais ma ressource que j'essaye de charger depuis ma dll se trouve dans elle-même pas dans l'exe host. donc il ne trouve pas la bitmap avec load image.

Voilà tout ce que j'ai fait :

dans le fichier .rc

CP_BGBITMAP BITMAP DISCARDABLE "controlpanel.bmp"

dans le fichier .cpp

BOOL WINAPI DllEntryPoint (HINSTANCE hInstance,ULONG ulReason,LPVOID pv){

    switch (ulReason) {
   
        case DLL_PROCESS_ATTACH:
            g_hInst=hInstance;
           ...
}

LRESULT CALLBACK ControlPanelProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   ...
    case WM_PAINT:
        HDC hdc;
        HDC hdcMemory;
        PAINTSTRUCT ps;

        hdc=BeginPaint(hwnd,&ps); // obtient un handle de contexte de périphérique
      
        BITMAP bm;
        hbitmap=(HBITMAP) LoadImage(g_hInst,MAKEINTRESOURCE(CP_BGBITMAP),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION); 
        if(hbitmap!=NULL){
            hdcMemory=CreateCompatibleDC(NULL); 
            SelectObject(hdcMemory,hbitmap);
            GetObject(hbitmap,sizeof(bm),&bm);
            BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hdcMemory,0,0,SRCCOPY);
            DeleteDC(hdcMemory);
        }
      
      ...
}

Et là je n'obtient pas de hbitmap, ma ressource n'est pas trouvée.

http://www.rc-bot.com/bannieres/banniere468x60.jpg
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Ne fais pas un LoadImage() à chaque WM_PAINT mais 1 seule fois dans WM_CREATE (ou WM_INITDIALOG).

ciao...
BruNews, MVP VC++
Messages postés
116
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
13 février 2008

Ok pour le loadimage je le ferais qu'une fois dans wm create, mais ça ne résout pas le problème que la ressource n'est pas trouvée. Ce n'est pas impossible de charger une ressource d'une dll à partir d'elle même ?

J'ai toujours chargé mes ressources de cette façon sous devcpp, maintenant je travaille sous vc++, ça fonctionne de la même façon ?

http://www.rc-bot.com/bannieres/banniere468x60.jpg
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Va nickel sur VC++ aussi, preuve ici:
http://www.cppfrance.com/code.aspx?ID=39858

Regarde dans le fichier DlgDll.c

Faut vérifier tes IDs de ressource ou truc de ce genre.

ciao...
BruNews, MVP VC++
Messages postés
116
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
13 février 2008

Bon je ne trouve pas la solution, tout me semble bien déclaré, j'ai la version express de VC studio, qui ne gère pas directement les fichiers.rc, elle semble les compiler, mais je me demande si elle fait bien tous les liens. Comme je suis étudiant je vais voir pour me procurer la version pro. On verra si si je peux acceder à ma ressource.

http://www.rc-bot.com/bannieres/banniere468x60.jpg
Messages postés
116
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
13 février 2008

Avec Visual Studio 2005 Pro ça a donné la même chose, le problème vient bien du hInstance car j'ai trouvé une solution de secours qui fonctionne :

HINSTANCE me = LoadLibrary(DLL_NAME);
hbitmap=(HBITMAP) LoadImage(me,MAKEINTRESOURCE(IDB_CPBGBITMAP),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION); 
FreeLibrary(me);

Ma dll se charge elle même le temps d'extraire l'image.
Ceci m'embète un peu comme méthode, car je crain que la dll ne puisse pas toujours être chargée. Enfin pour l'instant ça me débloque sur ce point.

Si quelqu'un a une explication sur les faits ...

En tout cas merci BruNews pour t'être penché sur mon problème.

A bientôt

http://www.rc-bot.com/bannieres/banniere468x60.jpg
Messages postés
116
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
13 février 2008

Et bien voilà on y arrive !!! Merci beaucoup

http://www.rc-bot.com/bannieres/banniere468x60.jpg