現在クリップボードにあるビットマップデータを
ビットマップファイルに保存するプログラムをWINAPI32で書いているのですが
どうにもやり方がわからないので質問させて下さい。
試しに以下のようなクリップボードからビットマップのハンドルを取得して
そこからビットマップのヘッダ情報を読み込むようなプログラムを書いてみたのですが
*windowsプログラムだと数値の出力がややこしいのでコンソールで書きました
#include<windows.h>
#include<stdio.h>
int main()
{
HANDLE hBitmap,hMem,hMem2;
HWND std;
LPBITMAPFILEHEADER lpBp;
LPBITMAPINFOHEADER lpBi;
DWORD dwFile;
DWORD dwOffbits,dwFsize;
char szFile[3];
LONG bw,by;
BOOL bRet;
std = FindWindow(NULL,NULL); //コンソールのウインドウハンドル取得
if(std == NULL)
{
printf("ウインドウハンドル取得エラー");
}
OpenClipboard(std);
hBitmap = GetClipboardData(CF_BITMAP); //ビットマップハンドルの取得
if(hBitmap == NULL)
{
printf("ビットマップがクリップボードにありません\n");
return -1;
}
/*ビットマップファイルヘッダーの取得と数値の書き込み*/
hMem = GlobalAlloc(GHND,sizeof(LPBITMAPFILEHEADER));
lpBp = (LPBITMAPFILEHEADER)GlobalLock(hMem);
bRet = ReadFile(hBitmap,lpBp,sizeof(LPBITMAPFILEHEADER),&dwFile,NULL);//ビットマップハンドルからのファイル読み込み ここでエラー発生
if(bRet ==FALSE)
{
printf("ファイル読み込みエラー");
return -1;
}
dwOffbits = lpBp->bfOffBits;
dwFsize = lpBp->bfSize;
szFile[0] = LOBYTE(lpBp->bfType);
szFile[1] = HIBYTE(lpBp->bfType);
szFile[2] = '\0';
printf("offbits=%ld\nFileSize = %ld\nFileType = %s\n",dwOffbits,dwFsize,szFile);
/*ビットマップインフォヘッダーの取得と数値の書き込み*/
hMem2 = GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER));
lpBi = (LPBITMAPINFOHEADER)GlobalLock(hMem2);
ReadFile(hBitmap,lpBi,sizeof(BITMAPINFOHEADER),&dwFile,NULL);
bw = lpBi->biWidth;
by = lpBi->biHeight;
printf("x = %ld\n y = %ld",bw,by);
GlobalUnlock(hMem);
DeleteObject(hBitmap);
CloseClipboard();
return 0;
}
bRet = ReadFile(hBitmap,lpBp,sizeof(LPBITMAPFILEHEADER),&dwFile,NULL);
上記の行で、ファイルが読み込めずエラーが発生してしまいます。
Readfile関数はCreate関数で作成したハンドルしか読めない様子なので行き詰ってしまいました。
根本的なプログラミング方法が間違っている気がします。
クリップボードからBMP保存方法についての考え方をご指導いただけないでしょうか?
よろしくお願いいたします。
