3 votes

LoadImage() retourne NULL et GetLastError() retourne 0

J'ai cherché sur le net dans différents forums pour trouver une réponse, mais il semble qu'il n'y ait pas de réponse à mon cas...

Je travaille sous Windows 7, VS2010.

J'ai une application qui utilise une minuterie pour appeler une fonction de rafraîchissement de la barre des tâches. Dans cette fonction de la barre des tâches se trouve un appel à LoadImage() qui obtient une image d'icône à partir des fichiers de ressources et éventuellement dans la barre des tâches (avec shell_notifyicon). Lors de l'exécution de l'application, cela semble fonctionner correctement pendant les deux premières heures, mais tout à coup, la fonction LoadImage() commence à échouer (c'est toujours le même fichier .ico qu'elle essaie de charger) et renvoie NULL. J'ai inséré un appel GetLastError juste après mais il renvoie toujours 0 (indiquant le succès). L'image elle-même est toujours bonne et valide, et je n'ai aucun moyen d'expliquer cela.

Un indice ? Toute aide est très appréciée !

Voici un extrait de code :

if (ghInst && hwnd)
{
    DWORD err;
// Update Tray Icon Here
    small_icon=LoadImage(ghInst, MAKEINTRESOURCE(IconId), IMAGE_ICON,
        GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0);
    err = GetLastError();
    if (!small_icon)
    {
        LPVOID lpMsgBuf;
        //DWORD err = GetLastError();
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
                      FORMAT_MESSAGE_FROM_SYSTEM |
                      FORMAT_MESSAGE_IGNORE_INSERTS,
                      NULL,
                      err,
                      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                      (LPTSTR) &lpMsgBuf,
                      0, NULL );

        printf("LoadImage FAILED error message: %d %s\n" ,err ,lpMsgBuf);
    }

    nid.uFlags=NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid.uCallbackMessage=UWM_SYSTRAY;
    nid.hIcon=small_icon;   /* 16x16 icon */

    if (bIconExist)
        Shell_NotifyIcon(NIM_MODIFY, &nid);
    else
        Shell_NotifyIcon(NIM_ADD, &nid);
}

3voto

jamesdlin Points 13455

Je pense que le problème est certainement dû à la fuite d'objets GDI et au fait que vous êtes à court de gestionnaires d'objets GDI. Le gestionnaire de tâches standard de Windows peut vous montrer le nombre d'objets GDI pour votre processus.

Vous n'appelez pas LoadImage con LR_SHARED donc vous doit libérer l'icône avec DestroyIcon après. Voir la section "Remarques" pour les LoadImage documentation :

http://msdn.microsoft.com/en-us/library/ms648045%28v=VS.85%29.aspx

(Incidemment, vous devriez également libérer la chaîne allouée par FormatMessage .)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X