BOOL CWayCTL::SaveBmpAppFiles(DDSURFACEDESC ddsdbmp)
{
int i=0,j=0,k=0;/////////////////////////////////////////////     
int nWidth=0,nHeight=0;
CString buf;
BYTE * tem;
CBitmap bmap;
BITMAP bm;
nWidth = ddsdbmp.dwWidth;
nHeight = ddsdbmp.dwHeight;
tem=new BYTE[nWidth*nHeight*4];
memcpy(tem,(BYTE *)ddsdbmp.lpSurface,nWidth*nHeight*4);
bm.bmPlanes = 1;
bm.bmWidth = nWidth;
bm.bmHeight = nHeight;
bm.bmWidthBytes = nWidth*4;
bm.bmType = 0;
bm.bmBitsPixel = 32;
bmap.CreateBitmapIndirect(&bm);
if(!bmap.SetBitmapBits(nWidth*nHeight*4,tem))/////////////////////////////////////
                AfxMessageBox("SetBitmapBits");
delete []tem;
        return  true;
}看上面的函数,自己写的,照这上面的在我这里运行没有什么问题.
但是上面函数中有三个变量是多余的,就是第一行的i,j,k;理论上应该是可以去掉的,实际上去掉程序也没有报错,但是在运行的时候就有问题了.
bmap.SetBitmapBits(nWidth*nHeight*4,tem)成功的返回为非零,否则为0.照上面的运行没有问题一切正常.但是一担去掉I,J,K的定义后SetBitmapBits返回就为0了,很奇怪.应该是没有任何关系的啊.
而且如果将int i,j,k;换成是CString a,b,c;也是一切正常.也就是说只要在函数开头定义任意三个参数,函数SetBitmapBits工作就正常.否则就返回0.
为什么?很郁闷!

解决方案 »

  1.   

    是很奇怪,这个问题很像内存越界了,正好用三个变量预先分配一点栈空间,所以内存越界也只是越到这三个无用变量中,不会导致其它问题。从代码中还看不出问题在哪。你把参数类型从 DDSURFACEDESC 改成 DDSURFACEDESC& 或者 DDSURFACEDESC* 试试是否还是一样。
      

  2.   

    改了,但是结果还是一样的.
    还有就是我把函数声明改成了:
    BOOL CWayCTL::SaveBmpAppFiles(DDSURFACEDESC *ddsdbmp,int flags,int AviFlags)
    然后后面少定义了2个参数,函数也是一切正常,而且这两个参数的数值也是正常的
      

  3.   

    再补充一点,如果多定义一个变量,SetBitmapBits返回0.
    我的大脑快死机了,怎么也想不通,虽然目前整个程序没什么问题.但就是这里有个隐患.
      

  4.   

    ddsdbmp.dwSize = sizeof (DDSURFACEDESC);