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

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

我正在使用Windows 7,VS2010。

我有一个应用程序使用计时器来调用任务栏刷新function。 在任务栏function中,调用LoadImage()从资源文件中获取图标图像,最终到达任务pipe理器(带有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对象计数。

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

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

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