WinCE5.0 运行异常提示:0x80000002解决过程

本文解决了一个在MIPS架构下加载BMP图片时遇到的异常问题,异常代码为0x80000002,原因是由于BMP文件头未对齐导致的访问异常。通过对BMP文件头进行逐字节拷贝并重新构造结构体解决了此问题。

场景

    将代码移植到Wince5.0系统上,芯片框架是mips,之前的代码在x86和arm等架构上运行正常。显示bmp位图的时候会弹出窗口提示:异常:0x80000002错误提示


步骤

1)

    通过VS错误查询工具得到的结果是:内存已经用完,实际上还有内存可以申请

2)

    尝试加载小图片,无效

3)

    不加载图片,成功显示

4)

    尝试在其他的地方可以申请到8MB的内存

5)

    通过日志输出,定位到bmp位图的结构体赋值的过程中,出现错误,初步怀疑是栈溢出,但是如果省去不调用,还是可以执行成功的

6)

    百度过程中,发现该错误提示还有一层含义:

程序读取一个未经对齐的数据时引发的异常 EXCEPTION_DATATYPE_MISALIGNMENT 属于硬件异常

7)

    原来bmp位图的结构体的头部是一个14个字节的结构体,里面的变量并没有进行字节的对齐,属于非对齐的地址访问,所以有些不对齐的b变量不能够直接访问,需要将数据通过memcpy逐个字节拷贝出来,然后拼凑成完整的属性。

  //在mips架构下不支持非对齐数据访问,bmp位图头部是14个字节,不符合4个字节对齐访问,因此采用字节拷贝的方式进行访问

  int offsetWidth = (int)&((PBITMAPINFOHEADER)0)->biWidth;

  memcpy(&(dest->m_width), offset + offsetWidth, sizeof(LONG));

  int offsetHeight = (int)&((PBITMAPINFOHEADER)0)->biHeight;

  memcpy(&(dest->m_height), offset + offsetHeight, sizeof(LONG));






    本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1880092,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值