LoadImage () возвращает NULL, а GetLastError () возвращает 0 - PullRequest
2 голосов
/ 05 июня 2011

Я искал ответ по сети на разных форумах, но, похоже, не соответствует моему делу ...

Я работаю в Windows 7, VS2010.

У меня есть приложение, которое использует таймер для вызова функции обновления панели задач.В этой функции панели задач находится вызов LoadImage (), который получает изображение значка из файлов ресурсов и, в конечном итоге, в панель задач (с shell_notifyicon).При запуске приложения это, кажется, работает нормально в течение первых нескольких часов, но затем внезапно происходит сбой LoadImage () (это всегда тот же файл .ico, который он пытается загрузить) и возвращает NULL.Я вставил вызов GetLastError сразу после этого, но он всегда возвращает 0 (указывает на успех).Само изображение все еще хорошее и правильное, и я не могу объяснить это.

Есть какие-нибудь подсказки?Любая помощь очень ценится!

Вот фрагмент кода:

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);
}

1 Ответ

3 голосов
/ 05 июня 2011

Я думаю, что проблема почти наверняка состоит в том, что вы пропускаете объекты GDI и у вас заканчиваются дескрипторы объектов GDI.Стандартный диспетчер задач Windows может показать количество объектов GDI для вашего процесса.

Вы не звоните LoadImage с LR_SHARED, поэтому необходимо освободить значок с помощью DestroyIcon потом.См. Раздел «Примечания» для документации LoadImage:

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

(Кстати, вам также следует освободить строку, выделенную FormatMessage.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...