我一直在不同的论坛上网上搜索答案,但是似乎与我的情况不符...

我正在使用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);
}

最佳答案

我认为问题几乎可以肯定是您正在泄漏GDI对象,并且用完了GDI对象句柄。标准的Windows任务管理器可以为您显示进程的GDI对象数。

您不会使用LoadImage调用LR_SHARED,因此之后必须释放带有DestroyIcon的图标。请参见LoadImage文档的“备注”部分:

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

(顺便说一句,您还应该释放FormatMessage分配的字符串。)

10-04 13:33