【发布时间】:2018-08-22 21:01:11
【问题描述】:
我正在开发一个 C++ 应用程序,它有一个动态更新的 notifyIcon。事情进展顺利,除了这个 ONE 问题; hIcon 变为 NULL,并抛出 ERROR_NOT_SUPPORTED。我终其一生都无法弄清楚发生了什么。这是我绘制 HICON 的代码:
// hIco is initialised like this:
// hIco = CreateIcon(NULL, 32, 32, 1, 32, { 0x00 }, { 0x00 });
//HICON hIco;
void CreateGraphIco() {
int width = 32;
int height = 32;
const int size = 32 * 32 * 4;
// Get old icon buffer
ICONINFO info = { 0 };
GetIconInfo(hIco, &info);
BYTE xorBuffer[size];
BYTE andBuffer[size];
GetBitmapBits(info.hbmColor, size, xorBuffer);
GetBitmapBits(info.hbmMask, size, andBuffer);
// (The drawing code for the icon is quite long,
// complicated, and irrelevant, so i'll leave it out)
hIco = CreateIcon(NULL, width, height, 1, 32, andBuffer, xorBuffer);
DeleteObject(info.hbmColor);
DeleteObject(info.hbmMask);
notify.hIcon = hIco;
Shell_NotifyIcon(NIM_MODIFY, ¬ify);
}
虽然这确实有效,但它只能工作几秒钟或几分钟,直到最终,notifyIcon 将消失并且 hIco 将变为 NULL。
任何帮助,将不胜感激!我真的在这个问题上苦苦挣扎,如果有人能帮助我解决这个问题,我将非常感激。我确定我犯了一些我什至没有注意到的愚蠢错误。
干杯!
【问题讨论】:
-
notify.hIcon = hIco;如果有旧图标?你打电话给DestroyIcon了吗?看起来很像内存泄漏......不幸的是,API documentation 对任何事情都不精确,但我可以想象CreateIcon只允许创建有限数量的图标或只使用有限数量的内存。ERROR_NOT_SUPPORTED- 我假设你是通过GetLastError得到的? -
是的,我从“GetLastError”中得到了“ERROR_NOT_SUPPORTED”。你认为我应该在调用“CreateIcon”之前调用“DestroyIcon”?我会试一试,最初我在主 while 循环之后有“DestroyIcon”。
-
你不要打电话给
GetLastError。如果您需要帮助,我们需要minimal reproducible example。 -
好吧,DestroyIcon 似乎已经修复了它。谢谢@Aconcagua!大卫,下次我发布问题时,我一定会阅读您发送给我的链接。