快乐de小跳蛙 2021-05-25 15:23 采纳率: 50%
浏览 80
已采纳

VC++程序DEBUG调试时触发一个断点

最近刚接触MFC,在调试项目的时候,点击退出时总会触发一个断点,如果直接运行exe(无论是debug还是release)都没有问题。

 


设置断点发现是在GdiplusShutdown(m_pGdiToken);处触发的的断点。

basic::basic()
	{
		GdiplusStartup(&m_pGdiToken, &m_gdiplusStartupInput, NULL);
	}
	basic::~basic()
	{
		GdiplusShutdown(m_pGdiToken);
	}

查看相关代码始终没有找到,触发断点原因,相关代码如下:
 

bool ui::img_from_res(UINT nID, LPCTSTR sTR, Image * &pImg)
    {
        HINSTANCE hInst = AfxGetResourceHandle();
        HRSRC hRsrc = ::FindResource (hInst, MAKEINTRESOURCE(nID), sTR); // type
        if (!hRsrc)
            return false;
        // load resource into memory
        DWORD len = SizeofResource(hInst, hRsrc);
        BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
        if (!lpRsrc)
            return false;
        // Allocate global memory on which to create stream
        HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
        BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
        memcpy(pmem,lpRsrc,len);
        IStream* pstm;
        CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
        // load from stream
        pImg = Gdiplus::Image::FromStream(pstm);
        // free/release stuff
        GlobalUnlock(m_hMem);
        pstm->Release();
        FreeResource(lpRsrc);
        return true;
    }
DWORD ui::gifproc(LPVOID lpParam)
    {
        Image *img = (Image *)lpParam;
        UINT  nCount = img->GetFrameDimensionsCount();
        GUID* pDimensionsIDs = (GUID*)new GUID[nCount];
        img->GetFrameDimensionsList(pDimensionsIDs,nCount);
        wchar_t strGUID[39]={0};
        StringFromGUID2(pDimensionsIDs[0], strGUID, 39);
        UINT nFrameCount = img->GetFrameCount(&pDimensionsIDs[0]);
        delete[] pDimensionsIDs;
        
        int size = img->GetPropertyItemSize(PropertyTagFrameDelay);
        byte *p  = new byte[size];
        PropertyItem*  pItem = (PropertyItem*)p;
        img->GetPropertyItem(PropertyTagFrameDelay,size, pItem);
        
        int  fcount = 0;
        GUID guid  = FrameDimensionTime;
        HDC hDC = ::GetDC(m_gifwnd);
        Graphics gc(hDC);

        RECT rect = {0};
        GetClientRect(m_gifwnd, &rect);
        int x = (rect.right  - img->GetWidth()) / 2;
        int y = (rect.bottom - img->GetHeight()) / 2;

        while (m_gifruning)
        {            
            gc.DrawImage(img, x, y, img->GetWidth(), img->GetHeight());            
            img->SelectActiveFrame(&guid, fcount++);
            if (fcount == nFrameCount)
            {
                fcount = 0;
            }
            //long pause = ((long*)pItem->value)[fcount];
            //Sleep(pause);
        }
        ::ReleaseDC(m_gifwnd, hDC);
        delete []p;
        return 0;
    }
void ui::bitmap_ex(HDC hDC, HBITMAP hbitmap, int x, int y, int w, int h, int hv)
    {
        if (hDC != NULL && hbitmap != NULL)
        {
            if (hv == 0)
            {
                BITMAP bmp;            
                HDC hMM = CreateCompatibleDC(hDC);        
                GetObject(hbitmap, sizeof(BITMAP), &bmp);
                SelectObject(hMM, hbitmap);
                SetStretchBltMode(hDC, HALFTONE);
                StretchBlt(hDC, x, y, w, h, hMM, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);            
                DeleteObject(hbitmap);
                DeleteObject(hMM);
            }
            else
            {
                Graphics gr(hDC);
                Bitmap bitmap(hbitmap, NULL);
                if (hv == 1)
                {
                    Point HoPoints[] = {Point(x + w, y), Point(x, y), Point(x + w, y + h)};
                    gr.DrawImage(&bitmap, HoPoints, 3);
                }        
                else if (hv == 2)
                {
                    Point VePoints[] = {Point(x, y + h), Point(x + w, y + h), Point(x, y)};
                    gr.DrawImage(&bitmap, VePoints, 3);
                }
            }
        }
    }

求大神指点一下。

  • 写回答

4条回答 默认 最新

  • CSDN专家-link 2021-05-25 15:28
    关注

    主程序退出前,确保子线程已经退出。否则可能存在资源冲突,比如主线程退出了,资源释放了,但子线程还在使用该资源

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装