- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我注意到我的部分代码在被调用时泄漏了大量内存,我试图找出它泄漏的位置或原因,但我陷入了死胡同。
我已尝试使用 Visual Studio 2017 调试器拍摄快照以找出泄漏发生的位置,但据此没有任何重大泄漏。我也尝试过 Deleaker,我曾经使用过一次,它告诉我我泄露了 HDC 和 HBITMAP,但无法告诉我有多少内存。
第一个函数是 GetScreenBmp 可能会泄漏,但我没有正确释放所有内容吗?我知道我不会删除 hBitmap,但我需要归还它。那是内存泄漏的地方吗?
HBITMAP GetScreenBmp(HDC hdc, int screenPositionX, int screenPositionY, int screenSizeX, int screenSizeY) {
// Get screen dimensions
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
int nMousePositionX = 0, nMousePositionY = 0;
// Create compatible DC, create a compatible bitmap and copy the screen using BitBlt()
HDC hCaptureDC = CreateCompatibleDC(hdc);
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, screenSizeX, screenSizeY);
HGDIOBJ hOld = SelectObject(hCaptureDC, hBitmap);
BOOL bOK = BitBlt(hCaptureDC, 0, 0, screenSizeX, screenSizeY, hdc, screenPositionX, screenPositionY, SRCCOPY | CAPTUREBLT);
SelectObject(hCaptureDC, hOld); // always select the previously selected object once done
DeleteObject(hOld);
DeleteDC(hCaptureDC);
return hBitmap;
第二部分是这段代码,我不确定我是否正确删除了所有内容。
HDC hdc = GetDC(0);
HBITMAP hBitmap = GetScreenBmp(hdc, currentSplitInformationArray.screenPositionX, currentSplitInformationArray.screenPositionY, currentSplitInformationArray.screenSizeX, currentSplitInformationArray.screenSizeY);
BITMAPINFO MyBMInfo = { 0 };
MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader);
// Get the BITMAPINFO structure from the bitmap
if (0 == GetDIBits(hdc, hBitmap, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS)) {
MessageBox(NULL, "Resource not available\nDo you want to try again?", "Account Details", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);
}
// create the bitmap buffer
BYTE* lpPixels = new BYTE[MyBMInfo.bmiHeader.biSizeImage];
// Better do this here - the original bitmap might have BI_BITFILEDS, which makes it
// necessary to read the color table - you might not want this.
MyBMInfo.bmiHeader.biCompression = BI_RGB;
MyBMInfo.bmiHeader.biHeight = currentSplitInformationArray.screenSizeY * -1;
// get the actual bitmap buffer
if (0 == GetDIBits(hdc, hBitmap, 0, currentSplitInformationArray.screenSizeY, (LPVOID)lpPixels, &MyBMInfo, DIB_RGB_COLORS)) {
MessageBox(NULL, "Resource not available\nDo you want to try again?", "Account Details", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);
}
::SendMessage(testingComparison, STM_SETIMAGE,
(WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);
DeleteObject(&MyBMInfo);
DeleteObject(hBitmap);
ReleaseDC(NULL, hdc);
delete[] lpPixels;
如果这是之前已经回答过的问题,或者如果答案很容易在谷歌上搜索到,我提前表示抱歉,但我已经尝试了几个小时来修复它。
最佳答案
好的,我找到了解决方案。 STM_SETIMAGE 消息返回以前的图像,你必须自己处理它。 https://learn.microsoft.com/en-us/windows/desktop/Controls/stm-setimage
下次我应该学会更好地阅读文档,很抱歉浪费大家的时间。
::SendMessage(testingComparison, STM_SETIMAGE,
(WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);
通过简单的操作修复它
HBITMAP oldBitmap = (HBITMAP)::SendMessage(testingComparison, STM_SETIMAGE,
(WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);
DeleteObject(oldBitmap);
关于c++ - 我的 hdc/hbitmap 的内存泄漏在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53044504/
我认为标题非常具有解释性,但这里更详细地说明了我正在尝试做的事情。基本上就是说我在内存中加载了一个BITMAP。 我想从中提取 BITMAPINFOHEADER 并将其添加到我的数据包结构中,该结构将
例如,如果我使用 LoadImage() 从线程 A 中的文件加载位图,我可以在线程 B 中使用返回的 HBITMAP 吗? 最佳答案 是的,可以,但请记住,一次只能将位图选择到一个 DC 中。如果您
我将桌面屏幕截图创建为位图文件。 在 win32 C 中降低这个大图像文件(~3 MB)的分辨率的最佳方法是什么? 我想通过网络发送它,所以文件应该更小。 最佳答案 使用StretchBlt调整位图大
无论我多么努力地寻找和尝试,我都找不到这段代码泄漏的原因。实际上,我不确定泄漏,但每次使用这段代码时 GDI 对象的数量都会增加。 HBITMAP hBmp; hBmp = CreateDIBitma
我有一个 ID 为 PNG 文件的资源 ID_IMAGES。该资源是一个图像数组,大小相同 (16x16)。我想弄清楚是否可以提取这些图像中的任何一张并从中生成 HBITMAP。 我在网上四处寻找,但
我想使用 CreateBitmap() 从一个简单的 unsigned char 像素缓冲区(每个像素 3 个字节)创建一个 HBITMAP 对象这…… HBITMAP hbm = CreateBit
我需要 C++ 代码从一侧获取 HBITMAP 并通过套接字发送它,在另一侧接收并再次使其成为 HBITMAP。 必须快速有效 如果更舒服,用GDI+位图 最佳答案 那是行不通的! 您需要做的是使用
我有一个像素数组,我需要将其转换为 HBITMAP 以便在窗口中显示它。我尝试使用 CreateDIBitmap() 但我没有 BMP header 。我尝试根据 MSDN 文档手动构建它们,但这没有
我有一个应用程序可以从数据库中加载一些 blob 数据,这些数据可以表示各种位图和图标的 png 格式或原始二进制数据。这被存储在 std::vector 我正在使用 CImageList 对象在 T
如果我有一个名为 bitmap 的 BITMAP,如何将其转换为 HBITMAP? 到目前为止我已经尝试过: HBITMAP hbm = (HBITMAP)&bitmap; //doesn't wor
在大快捷方式中,我正在尝试编写程序,该程序通过 NamedPipe 位图从另一个应用程序接收到的位图绘制位图。 我将分别发送 BITMAPINFO 结构和从 GetBitmapBits 函数获得的位图
我先道歉;我是 c 的新手,我真的不知道自己在做什么。 我正在尝试使用 Windows 7 和 c 捕获和显示屏幕截图。我知道这听起来很愚蠢,最终我会在不同的程序中需要这些功能中的每一个,捕获屏幕的那
如果给定了 HBITMAP 指针,并且我的应用程序是控制台应用程序,我如何从 hbitmap 获取图像字节。 我尝试使用需要诸如 HDC 之类的参数的 GetDIBits,但我无法获得。 编辑: 我从
我在屏幕上显示位图时遇到问题。当我编译并运行不显示任何内容时,尝试逐步调试,发现下面的代码是问题所在。 HBITMAP hbm = (HBITMAP)LoadImage(hInstance,
我正在尝试为给定的 jpg 图像创建一个 avi 文件。我正在使用库读取 jpg 并为其准备 hbitmap。最后我添加它来创建 avi 文件。但我最终的 avi 文件包含倒置图像。我在 bitmap
我正在创建一个实用程序,它使用全局 Hook 将一些(用户可自定义的)图标绘制到桌面上的其他窗口上。由于位图对象是特定于进程的,因此在绘制它们之前,我在每个进程中为这些图标创建了单独的 HBITMAP
我有一个加载具有透明背景的图像的应用程序,然后我使用 StretchBlt 将其调整为所需的大小,使用 SetStretchBltMode 设置 HALFTONE (我尝试使用其他模式,在保持透明度不
您好 Stack Overflow 用户。看来我没有在以下代码中正确使用 CreateCompatibleBitmap(): #include using namespace std; int ma
我的环境: win32 视觉 C++ directx 我需要将另一个应用程序的面部映射到我的应用程序的纹理。 例如,我的 Internet Explorer 屏幕出现在我的 DirectX Cube
我有一个 HBITMAP,它是使用 Excel Interop 的 CopyPicture 方法创建的。出于某种原因,这会在图像的顶部和左侧边缘放置一个灰色边框,即使它们不是电子表格的一部分。有人能告
我是一名优秀的程序员,十分优秀!