为什么小弟我的程序的这段StretchDIBits总是返回的是0?

为什么我的程序的这段StretchDIBits总是返回的是0???
void   printpic::OnPaint()  
{
CClientDC   dc(this);   //   device   context   for   painting



BITMAPFILEHEADER   bmfHeader;//
BITMAPINFOHEADER   bmhdinfo;//
BITMAPINFO   bitmapinfo;
FILE   *   readstream;
if((readstream=fopen(lpszPathName, "rb "))==NULL){
return;
}
if   (fread(&bmfHeader,sizeof(BITMAPFILEHEADER),1,readstream)!=1)   {
return;
}
if   (fread(&bmhdinfo,sizeof(BITMAPINFOHEADER),1,readstream)!=1)   {
return;
}
bitmapinfo.bmiHeader=bmhdinfo;

char   *   p=   (char*)malloc(bmhdinfo.biSizeImage);


if(fread(p,1,bmhdinfo.biSizeImage,readstream)!=bmhdinfo.biSizeImage)
{
return;
}


int   ii=StretchDIBits(dc.GetSafeHdc(),0,0,bmhdinfo.biWidth,bmhdinfo.biHeight,0,0,
bmhdinfo.biWidth,bmhdinfo.biHeight,p,&bitmapinfo,DIB_RGB_COLORS,SRCCOPY);

free(p);

------解决方案--------------------
bitmapinfo 若不是24rgb缺少调色板信息
bmhdinfo.biSizeImage 不能保证!=0
StretchDIBits 看帮助是王道