LoadImage () renvoie NULL et GetLastError () renvoie 0

Je cherchais une réponse sur le net dans différents forums, mais mon cas ne semble pas correspondre à mon cas …

Je travaille sur Windows 7, VS2010.

J’ai une application qui utilise un minuteur pour appeler une fonction d’actualisation 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 du numéro de tâche (avec shell_notifyicon). Lors de l’exécution de l’application, cela semble fonctionner correctement pendant les premières heures, mais tout à coup, LoadImage () commence à échouer (c’est toujours le même fichier .ico qu’il tente de charger) et renvoie NULL. J’ai inséré un appel GetLastError immédiatement 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 de l’expliquer.

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, GetSystemMesortingcs(SM_CXSMICON), GetSystemMesortingcs(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); } 

Je pense que le problème est presque certainement que vous perdez des objects GDI et que vous manquez de descripteurs d’objects GDI. Le gestionnaire de tâches Windows standard peut vous montrer le nombre d’objects GDI pour votre processus.

Vous LoadImage pas LoadImage avec LR_SHARED , vous devez donc libérer l’icône avec DestroyIcon par la suite. Voir la section “Remarques” pour la documentation LoadImage :

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 .)