2011-06-05 104 views
1

我一直在周围的答案不同的论坛网上搜索,但似乎没有匹配我的情况......的LoadImage()返回NULL和GetLastError()返回0

我的工作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

使用Process Explorer的检查,你是不是泄漏GDI对象 – 2011-06-05 10:33:43

回答

3

我认为这个问题几乎可以肯定的是,你正在泄漏GDI对象和运行了GDI对象句柄。标准的Windows任务管理器可以显示您的进程的GDI对象数量。

你是不是叫​​与LR_SHARED,所以你必须免费的与DestroyIcon后图标。请参阅“备注”部分为​​文档:

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

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

+0

谢谢你们......这似乎在伎俩!我找到了解决这个问题的解决方案 – NightRider 2011-06-05 13:03:29

相关问题