程序运行时出现这样的错误
“Run-Time Check Failure #2 - Stack around the variable 'bmpinfo' was corrupted.”
在网上查找了相关信息,大概是说stack溢出或什么对齐之类的也有的说是把“c/c++代码生成这项”的"两者(/RTC1,等同于 /RTCsu)"改为默认值,这样改了,错误是消失了,但程序运行就得不到我想要的结果BOOL CLSDC::RemoteDisplay(HBITMAP hbitmap, RECT size)
{
BITMAP bmp;
GetObject(hbitmap, sizeof(BITMAP), &bmp); const int dataSize = (bmp.bmWidthBytes * bmp.bmHeight ); m_pMsgData = MapViewOfFile(m_hMsgFile, FILE_MAP_READ | FILE_MAP_WRITE,
0, 0, 0); if (m_pMsgData == NULL)
return FALSE; HDC hdc = GetDC(NULL);
HBITMAP bitmap = CreateCompatibleBitmap(hdc, bmp.bmWidth, bmp.bmHeight); BITMAPINFO bmpinfo;
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biBitCount = 0; int res;
res = ::GetDIBits(hdc, bitmap, 0, 1, NULL, &bmpinfo, DIB_RGB_COLORS);
if(res == 0)
return FALSE;
SelectObject(hdc, hbitmap); GetDIBits(hdc, hbitmap, 0, bmp.bmHeight, m_pMsgData, &bmpinfo, DIB_RGB_COLORS); UnmapViewOfFile(m_pMsgData);
return TRUE;
}

解决方案 »

  1.   

    改成这样试试    
    ZeroMemory(&bmpinfo, sizeof(BITMAPINFO));
    bmpinfo.bmiHeader.biSize      = sizeof(BITMAPINFOHEADER);
    bmpinfo.bmiHeader.biBitCount  = 0;
      

  2.   

    改了结果还是一样单步调试时,执行res = ::GetDIBits(hdc, bitmap, 0, 1, NULL, &bmpinfo, DIB_RGB_COLORS);
    得到的结果是正确的只是RemoteDisplay函数在返回时弹出那个错误
      

  3.   

    这个函数是在DLL库里面,这个DLL库的函数目前只写了两个,没有涉及动态内存的申请,只有一个内存映射文件的创建
    m_hMsgFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024*1024, mappingFileName);然后把图像信息写入内存映射文件中,方便其他进程共享
    源程序中没有涉及动态内存分配。所以这让我感到很困惑,不是知道是什么原因
      

  4.   

    把下面这几句注释掉试试   
    int res;
    res = ::GetDIBits(hdc, bitmap, 0, 1, NULL, &bmpinfo, DIB_RGB_COLORS);
    if(res == 0)
        return FALSE;
      

  5.   

    我改动了这几个地方后测试没有问题   BITMAPINFO bmpinfo;
    bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpinfo.bmiHeader.biBitCount = 0;改为如下:
    BITMAPINFO bmpinfo;
    ZeroMemory(&bmpinfo, sizeof(BITMAPINFO));
    bmpinfo.bmiHeader.biSize      = 40;
    bmpinfo.bmiHeader.biWidth     = bmp.bmWidth;
    bmpinfo.bmiHeader.biHeight    = bmp.bmHeight;
    bmpinfo.bmiHeader.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight; //int res;
    //res = ::GetDIBits(hdc, bitmap, 0, 1, NULL, &bmpinfo, DIB_RGB_COLORS);
    //if(res == 0)
    // return FALSE;      

      

  6.   

    去掉了,再用手动赋值这bmpinfo信息,错误没有,这原因是什么?
      

  7.   

    我刚在再试了试,把bmpinfo改成类成员变量,而不是在这个函数的局部变量
    int res; 
    res = ::GetDIBits(hdc, bitmap, 0, 1, NULL, &bmpinfo, DIB_RGB_COLORS); 
    if(res == 0) 
        return FALSE; 
    这些语句任然加上,错误也不会出现。
      

  8.   

    应该是结构体在内存字节对齐的原因   填充BITMAPINFO结构体的时候可能存在越界  我猜可能是这个    没有测试不好说
      

  9.   

    我也碰到了这个问题。
    看内存可以知道,在第二次调用GetDIBits的时候:GetDIBits(hdc, hbitmap, 0, bmp.bmHeight, m_pMsgData, &bmpinfo, DIB_RGB_COLORS);bmpinfo又被修改了,修改的范围超过了 sizeof(BITMAPINFOHEADER), 推测可能就是修改RGBQUAD了。但是对于 24位(或32位)的BMP图,应该是没有RGBQUAD内容的,BITMAPINFOHEADER后面直接就是数据了。目前我是用:int biSize =  sizeof(BITMAPINFOHEADER)+ 256*sizeof(RGBQUAD);
    BITMAPINFO* pbi =(BITMAPINFO*) new BYTE[biSize];来实现了,但还是想知道具体bmpinfo被修改的原因。
      

  10.   

    用biBitCount=0来调用GetDIBits?GetDIBits中的那个BITMAPINFO参数主要是个输入参数,是用来指定你想要的DIB的格式,而其中最重要的,就是要知道你想要获取的DIB的位数是多少,然后系统可以根据你要的位数进行转换,结果你传个0进去算怎么回事?让系统自己看着办?至少MSDN从来没说过“用biBitCount=0来调用GetDIBits,就会使用DDB本身的位数”。就算如此,那么你何必要用GetDIBits?为什么不用GetBitmapBits?
      

  11.   

    为什么不用GetBitmapBits?
        Note  This function is provided only for compatibility with 16-bit versions of Windows. Applications should use the GetDIBits function. 结果你传个0进去算怎么回事?
    bmpinfo.bmiHeader.biBitCount = 0;int res;
    res = ::GetDIBits(hdc, bitmap, 0, 1, NULL, &bmpinfo, DIB_RGB_COLORS);
    if(res == 0)
        return FALSE;在调用GetDIBits时,若指定LPVOID lpvBits 为NULL,If lpvBits is NULL and the bit count member of BITMAPINFO is initialized to zero, GetDIBits fills in a BITMAPINFOHEADER structure or BITMAPCOREHEADER without the color table. This technique can be used to query bitmap attributes. 不知道您的MSDN看仔细了没