Retrouver le hmodule d'une dll

Résolu
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008 - 23 mars 2007 à 10:00
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008 - 24 mars 2007 à 17:06
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 mars 2007 à 16:40
Remplace LoadLibrary par GetModuleHandle

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 mars 2007 à 10:09
Enregistre le hmodule dans DllMain().

ciao...
BruNews, MVP VC++
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
23 mars 2007 à 13:24
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 mars 2007 à 13:29
DllEntryPoint est autre nom de DllMain.

HINSTANCE thismod;

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

ciao...
BruNews, MVP VC++
0

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

Posez votre question
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
23 mars 2007 à 14:02
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 mars 2007 à 14:32
Ne fais pas un LoadImage() à chaque WM_PAINT mais 1 seule fois dans WM_CREATE (ou WM_INITDIALOG).

ciao...
BruNews, MVP VC++
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
23 mars 2007 à 15:28
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 mars 2007 à 15:41
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++
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
23 mars 2007 à 21:41
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
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
24 mars 2007 à 16:33
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
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
24 mars 2007 à 17:06
Et bien voilà on y arrive !!! Merci beaucoup

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