【问题标题】:hIcon ERROR_NOT_SUPPORTEDhIcon ERROR_NOT_SUPPORTED
【发布时间】: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, &notify);
}


虽然这确实有效,但它只能工作几秒钟或几分钟,直到最终,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!大卫,下次我发布问题时,我一定会阅读您发送给我的链接。

标签: c++ winapi


【解决方案1】:

好的,所以基本上对于将来遇到同样问题的任何人,请确保在致电 CreateIcon 之前先致电 DestroyIcon
感谢阿空加瓜!

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    相关资源
    最近更新 更多