gpt4 book ai didi

在 Windows : memory leak? 上重复数百次后 C++ 屏幕捕获失败

转载 作者:行者123 更新时间:2023-11-28 00:23:39 24 4
gpt4 key购买 nike

我使用一个函数,该函数使用 BitBlt 方法捕获屏幕,然后可以返回一个 HBITMAP

int screenCapture() {
int width = 1000;
int height = 700;

HDC hdcTemp, hdc;
BYTE* bitPointer;

hdc = GetDC(HWND_DESKTOP);
hdcTemp = CreateCompatibleDC(hdc);

BITMAPINFO bitmap;
bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = width;
bitmap.bmiHeader.biHeight = -height;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 24;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 0;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;
HBITMAP hBitmap = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
SelectObject(hdcTemp, hBitmap);
BitBlt(hdcTemp, 0, 0, width, height, hdc, 0, 0, SRCCOPY);
ReleaseDC(HWND_DESKTOP, hdc);
DeleteDC(hdcTemp);
return (int)bitPointer[0];
}

这里,函数只返回像素数组的第一个值。
实际上,它工作正常。

for (int i = 0; i >= 0; i++) {
cout << i << ": " << screenCapture() << endl;
}

但是当我尝试循环这个时,在几百轮(对我来说略高于 900 轮)后会产生错误,Access violation reading location 错误。

我还注意到,如果我减小 widthheight 的值,则调用错误的时间会更长。

我是一个真正的初学者,我不知道错误可能来自哪里,但它看起来像是内存问题,对吧?

最佳答案

如评论中所述,您正在泄漏您的 HBITMAP,以及在您调用之前已经在 HDC 中的原始 HBITMAP 选择对象()。每当您使用 SelectObject() 时,您必须始终恢复原始值(您不拥有它)。

不要忘记进行错误检查!

试试这个:

int screenCapture()
{
int result = -1;

int width = 1000;
int height = 700;

HDC hdcTemp, hdc;
BYTE* bitPointer;

hdc = GetDC(HWND_DESKTOP);
if (hdc != NULL)
{
hdcTemp = CreateCompatibleDC(hdc);
if (hdcTemp != NULL)
{
BITMAPINFO bitmap;
bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = width;
bitmap.bmiHeader.biHeight = -height;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 24;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 0;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;

HBITMAP hBitmap = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)&bitPointer, NULL, NULL);
if (hBitmap != NULL)
{
HBITMAP hPrevBitmap = SelectObject(hdcTemp, hBitmap);

BitBlt(hdcTemp, 0, 0, width, height, hdc, 0, 0, SRCCOPY);
result = (int) bitPointer[0];

SelectObject(hdcTemp, hPrevBitmap);
DeleteObject(hBitmap);
}

DeleteDC(hdcTemp);
}

ReleaseDC(HWND_DESKTOP, hdc);
}

return result;
}

关于在 Windows : memory leak? 上重复数百次后 C++ 屏幕捕获失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26177560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com