【发布时间】:2012-12-16 06:41:29
【问题描述】:
当我取消注释创建位图的代码行时,我遇到了第一次机会异常错误。我以与我制作的其他 sprite 相同的方式创建了这个 spritesheet BMP。错误信息是这样的:
First-chance exception at 0x004788ca in HenwayRevamped.exe: 0xC0000005: Access violation writing location 0x02224000.
我正在运行基于 Michael Morrison 的 GameEngine 类构建的游戏。我已经对此错误进行了几个小时的研究,包括许多 StackOverflow 线程和this handy site,但我仍然不确定问题出在哪里。这是函数调用:
// Create a bitmap from a resource
Bitmap::Bitmap(HDC hDC, UINT uiResID, HINSTANCE hInstance)
: m_hBitmap(NULL), m_iWidth(0), m_iHeight(0)
{
Create(hDC, uiResID, hInstance);
}
这是函数:
BOOL Bitmap::Create(HDC hDC, UINT uiResID, HINSTANCE hInstance)
{
// Free any previous DIB info
Free();
// Find the bitmap resource
HRSRC hResInfo = FindResource(hInstance, MAKEINTRESOURCE(uiResID), RT_BITMAP);
if (hResInfo == NULL)
return FALSE;
// Load the bitmap resource
HGLOBAL hMemBitmap = LoadResource(hInstance, hResInfo);
if (hMemBitmap == NULL)
return FALSE;
// Lock the resource and access the entire bitmap image
PBYTE pBitmapImage = (BYTE*)LockResource(hMemBitmap);
if (pBitmapImage == NULL)
{
FreeResource(hMemBitmap);
return FALSE;
}
// Store the width and height of the bitmap
BITMAPINFO* pBitmapInfo = (BITMAPINFO*)pBitmapImage;
m_iWidth = (int)pBitmapInfo->bmiHeader.biWidth;
m_iHeight = (int)pBitmapInfo->bmiHeader.biHeight;
// Get a handle to the bitmap and copy the image bits
PBYTE pBitmapBits;
m_hBitmap = CreateDIBSection(hDC, pBitmapInfo, DIB_RGB_COLORS,
(PVOID*)&pBitmapBits, NULL, 0);
if ((m_hBitmap != NULL) && (pBitmapBits != NULL))
{
const PBYTE pTempBits = pBitmapImage + pBitmapInfo->bmiHeader.biSize +
pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD);
CopyMemory(pBitmapBits, pTempBits, pBitmapInfo->bmiHeader.biSizeImage);
// Unlock and free the bitmap graphics object
UnlockResource(hMemBitmap);
FreeResource(hMemBitmap);
return TRUE;
}
// Something went wrong, so cleanup everything
UnlockResource(hMemBitmap);
FreeResource(hMemBitmap);
Free();
return FALSE;
}
另外,这是我的带有本地窗口的 IDE 的屏幕截图。装订线中的绿色箭头图标指向引发异常的行:
Image Hosted by ImageShack.us http://imageshack.us/a/img341/7678/20121216010703am.png
是我的设备上下文有问题吗? hDC 变量下的红色感叹号图标看起来可能指向问题,但它分配了一个句柄,所以我不确定。我的想法已经用完了,正在求助于大师。
【问题讨论】:
-
您可能已经知道,这与从您在帖子中首先列出的构造函数中触发的
Create()调用不同。该代码触发Create(),需要设备上下文、宽度、高度和颜色。您显示的不相关的Create()正在加载资源位图(或至少尝试加载)。 -
pBitmapInfo->bmiHeader里面有什么?我预计biSizeImage的值在那里是错误的。 -
感谢@WhozCraig 的提醒;我错误地发布了错误的重载调用。实际调用现在在 OP 中。 @Roman,该调用返回 147458。从图像的 Windows 属性窗口中,图像大小为 147512。如果这是问题,我该如何解决?
-
我看到的是你有 768x64 的图像。我看不到它的位数,假设它是 24 位/像素。因此,总共 147456 个字节。这就是
biSizeImage中应该包含的内容。我希望 API 分配这个长度的内部缓冲区。如果那里有错误的值(API 可能已忽略),则尝试复制更多字节,然后缓冲区可以容纳并因此预期。这就是为什么我认为这个值可能是错误的。
标签: c++ winapi visual-c++ memory-management