【问题标题】:Why app sometimes crashes when getting Icon from file?为什么从文件中获取图标时应用程序有时会崩溃?
【发布时间】:2018-09-26 10:29:04
【问题描述】:

我具有从文件中加载和获取图标的功能,如下所示:

std::map<wstring, HICON> m_map_icons;

void WindowSysTray::_loadIconFromFiles()
{
    ...
    for (int i = 0; i < 3; ++i) {
        wstring temp = path + trayList[i];
        HICON hIcon = NULL;
        Gdiplus::Bitmap bitmap(temp.c_str(), false);
        bitmap.GetHICON(&hIcon);
        pair<wstring, HICON> _pair = make_pair(trayList[i], hIcon);
        m_map_icons.insert(_pair);
    }
}

HICON WindowSysTray::getIconFromFile(const wchar_t* iconPath)
{
    auto iter = m_map_icons.find(wstring(iconPath));
    if (iter == m_map_icons.end()) {
        return NULL;
    }
    else {
        return iter->second; // ---Issue here---
    }
}

...
hIcon = getIconFromFile(L"tray.png");
if (hIcon)
{
    TrayIcon.SetIcon(hIcon);
}
...

当我调用getIconFromFile 函数时,它有时会在函数末尾返回值时崩溃:

return iter->second;

我通过调用 _loadIconFromFiles 函数验证并确保我之前加载了 Icon。

有谁知道这个问题的可能根本原因是什么?

【问题讨论】:

  • 可能WindowSysTray 的实例无效?发布minimal reproducible example 以展示您如何创建此类的实例。
  • 发布的代码似乎没有任何问题。你怎么知道返回值时它会崩溃?
  • 我会问调试器。
  • @CuongHuynh 从函数退出时崩溃有时表明堆栈损坏,但在发布的代码中没有证据。
  • @CuongHuynh 你只发布了课程代码——这还不够。我们不知道何时、何地或如何创建 WindowSysTray 实例。如果您使用的是无效的 WindowSysTray 实例,那么在该无效实例中执行的任何操作都会导致未定义的行为。

标签: c++ windows trayicon


【解决方案1】:

m_map_icons.find() 可能会出错。如果m_map_icons 为空,则可能会出现这种情况。您可以通过检查开始WindowSysTray::getIconFromFileif (m_map_icons.size() == 0) return 0;

【讨论】:

    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多