-
No more that 23???
Ok I ran into a problem and Im pulling my hair out trying to get around it. Im writing a small screen capture program that saves the bitmaps to disk, here is a simplified source of what im trying to do...
Code:
#include <windows.h>
#include <stdio.h>
//Copied from http://www.geocities.com/krishnapg/bitmap.html
void SaveBitmap(char *szFilename,HBITMAP hBitmap)
{
HDC hdc=NULL;
FILE* fp=NULL;
LPVOID pBuf=NULL;
BITMAPINFO bmpInfo;
BITMAPFILEHEADER bmpFileHeader;
do{
hdc=GetDC(NULL);
ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
GetDIBits(hdc,hBitmap,0,0,NULL,&bmpInfo,DIB_RGB_COLORS);
if(bmpInfo.bmiHeader.biSizeImage<=0)
bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*
(bmpInfo.bmiHeader.biBitCount+7)/8;
if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage))==NULL)
{
MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
break;
}
bmpInfo.bmiHeader.biCompression=BI_RGB;
GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);
if((fp = fopen(szFilename,"wb"))==NULL)
{
MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
break;
}
bmpFileHeader.bfReserved1=0;
bmpFileHeader.bfReserved2=0;
bmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
bmpFileHeader.bfType='MB';
bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp);
}while(FALSE);
if(hdc) ReleaseDC(NULL,hdc);
if(pBuf) free(pBuf);
if(fp) fclose(fp);
}
int WinMain(HINSTANCE h, HINSTANCE hp, LPSTR c, INT s){
int i;
for(i=1; i<=30; i++){
//Capture the screen
HDC dc = GetDC(NULL);
HDC cdc = CreateCompatibleDC(dc);
HBITMAP screen = CreateCompatibleBitmap(dc, 1280, 1024);
HBITMAP dummy = SelectObject(cdc, screen);
BitBlt(cdc, 0, 0, 1280, 1024, dc, 0, 0, SRCCOPY);
screen = SelectObject(cdc, dummy);
char TEMPFILE[255];
sprintf(TEMPFILE, "c:/bmp%i.bmp", i);
//Save the HBITMAP to disk
SaveBitmap(TEMPFILE, screen);
DeleteObject(screen);
DeleteDC(cdc);
ReleaseDC(NULL, dc);
}
return 0;
}
This code works fine and captures the full screen up to 23 times, after that it only creates 1kb bitmap files with a 0x0 resolution. Just to clarify, the first 23 runs through the 'for' loop work perfect but after that it just loses it and saves empty files and shows no error.
If anyone can help me get more than 23 runs out of this I would be grateful :confused:
-
Can you post the entire code?
-
Or better yet attach the text version of it to your post. Placing it all in code blocks would result in a very long post and it is not needed.
-
Sorry if I didnt make myself clear - I rewrote what I was trying to do into this simple example to try and get it working so what you see above is the full source of that project at the moment. It compiles and runs ok in pellesC except for the problem mentioned in my last post...
-
Is the while loop the same in the actuall app?
If the loop executes more than once you will lose the GDI objects and memory each loop as the clean up is only called once (after the while exits).
-
The code that you appear to have copied form here http://www.geocities.com/krishnapg/bitmap.html is complete crap.
Calling the function even once will result in leaking and using up all available memory or file handles and leave your app in an essentially useless state.