首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LoadImage()返回NULL,GetLastError()返回0

LoadImage()返回NULL,GetLastError()返回0
EN

Stack Overflow用户
提问于 2011-06-05 18:00:47
回答 1查看 3.4K关注 0票数 3

我一直在网上不同的论坛上寻找答案,但似乎没有与我的情况相匹配的……

我的工作是Windows7,VS2010。

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

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

下面是一个代码片段:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-05 18:58:49

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

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6242193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档