LoadImage() 返回 NULL 并且 GetLastError() 返回 0

Posted

技术标签:

【中文标题】LoadImage() 返回 NULL 并且 GetLastError() 返回 0【英文标题】:LoadImage() returns NULL and GetLastError() returns 0 【发布时间】:2011-06-05 10:00:46 【问题描述】:

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

我正在使用 Windows 7,VS2010。

我有一个使用计时器来调用任务栏刷新功能的应用程序。在该任务栏函数中调用 LoadImage(),它从资源文件中获取图标图像,并最终到达 taskber(使用 shell_notifyicon)。运行应用程序时,前几个小时似乎工作正常,但突然之间 LoadImage() 开始失败(它总是尝试加载相同的 .ico 文件)并返回 NULL。我在之后直接插入了一个 GetLastError 调用,但它总是返回 0(表示成功)。 图像本身仍然是好的和有效的,我无法解释。

有什么线索吗? 非常感谢任何帮助!

这是一个代码sn-p:

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

【问题讨论】:

使用 Process Explorer 检查您是否没有泄漏 GDI 对象 【参考方案1】:

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

你没有用LR_SHARED 调用LoadImage,所以你必须之后用DestroyIcon 释放图标。请参阅LoadImage 文档的“备注”部分:

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

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

【讨论】:

谢谢你们……这似乎成功了!我找到了解决它的方法

以上是关于LoadImage() 返回 NULL 并且 GetLastError() 返回 0的主要内容,如果未能解决你的问题,请参考以下文章

来自 LocationClient 的 getLastLocation() 始终返回 null [重复]

在签名为 return int 的方法中返回 null?

[sql]sql函数coalesce返回第一个非空的值

LocationManager.getLastKnownLocation() 返回 null,并且永远不会调用 onLocationChanged

Mysqli_query 返回 false 并且 Mysqli_error 返回 NULL? [复制]

Android 4.4.2 - 相机 uri 返回 null 并且裁剪功能也不起作用?