LoadImage() 返回 NULL,而 GetLastError() 返回 0。

3

我在不同的论坛上搜寻答案,但好像没有一个能解决我的问题...

我正在使用Windows 7和VS2010。

我有一个应用程序,它使用定时器来调用任务栏刷新函数。在该任务栏函数中,有一个从资源文件获取图标图像并最终到任务栏(使用shell_notifyicon)的LoadImage()调用。运行应用程序时,这似乎在前几个小时内都正常工作,但突然之间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
请使用“进程资源管理器”检查是否存在GDI对象泄漏。 - David Heffernan
1个回答

3
我认为问题几乎肯定是您正在泄漏GDI对象并且用尽了GDI对象句柄。标准的Windows任务管理器可以显示您的进程的GDI对象计数。
您没有使用LR_SHARED调用LoadImage,因此您必须之后使用DestroyIcon释放图标。请参阅LoadImage文档中的“备注”部分:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接