CreateCompatibleDC返回NULL如何处理

windowsAPI + C语言

反复执行以下代码,其中CreateCompatibleDC有几率返回NULL,此时GetLastError = 0x6,但没找到哪里发生内存泄漏,应该都Delete了,且Delete返回均正常。

此主线程反复执行且只反复执行这些步骤。此时有线程在处理消息循环,且消息循环确保没有问题。CreateCompatibleDC出现错误的时机貌似是随机不确定且不连续的,结束后过一段时间还是会报错

///////////////////////////////////////////////init
BITMAPINFO bmi = {{0}};
VOID* p_bmp_buf;
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height - 1;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biSizeImage = width * height * 4;
m_hdc = CreateCompatibleDC(disapp.m_hdc); //内存泄露可能?
if(m_hdc == NULL)
{
MAKEDEBUG(false, _T("from:(...-sturct tagIMAGE-newImage-sign2)\ninf: api_err 0x%x (see CreateCompatibleDC)"), GetLastError());
return DEM_WINAPI;
}
m_pBitmap = CreateDIBSection(disapp.m_hdc, &bmi, DIB_RGB_COLORS, (VOID**)&p_bmp_buf, NULL, 0);
if(m_pBitmap == NULL)
{
int err = GetLastError();
DeleteDC(m_hdc);
MAKEDEBUG(false, _T("from:(...-sturct tagIMAGE-newImage-sign3)\ninf: api_err 0x%x (see CreateDIBSection)"), err);
return DEM_WINAPI;
}
g_hbmp_def = (HBITMAP)SelectObject(m_hdc, m_pBitmap); //以备清空内存
text_font = (HFONT)GetCurrentObject(m_hdc, OBJ_FONT);
m_buffer = (PDWORD)p_bmp_buf;


text_setfontf(20, 10);
SetBkMode(m_hdc, TRANSPARENT);
////////////////////////////////////////////////////reset
if(m_hdc != NULL)
{
if(DeleteObject(SelectObject(m_hdc, g_hbmp_def)) == 0) MAKEDEBUG(false, "??1");
// if(DeleteObject(m_pBitmap) == 0) MAKEDEBUG(false, "??2");
if(DeleteObject(text_font) == 0) MAKEDEBUG(false, "??3");
if(DeleteDC(m_hdc) == 0) MAKEDEBUG(false, "??4");
}
g_hbmp_def = NULL;
text_font = NULL;
m_hdc = NULL;
m_pBitmap = NULL;
m_buffer = NULL;

有没有可能内存不足的情况呢?因为分配过多,没有释放导致

现在函数锁定在子线程处理WM_PAINT时重绘和这里的分配内存有较小概率冲突。Bitblt函数似乎会莫名改写其他内存导致这里内存分配不正常?还是说BitBlt会直接占用整个内存块?还是。。。由于处理时间较长,没有线程锁保护?

感谢,问题已解决。

之前就有想过出现问题的时机可能是子线程处理WM_PAINT时重绘占用了HDC和这里的分配内存有较小概率冲突。Bitblt函数似乎会直接占用整个HDC,甚至连读取都会报错。经过测试锁定了就是这个问题。解决办法就是不去用HDC,而随便找个替代即可。或者最简单的方法是把出错的这一行m_hdc = CreateCompatibleDC(disapp.m_hdc);的参数改为默认的0即可。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632