呼び出し時のパラメータが足りない
自作関数windowcaputureを作成して、
他のmain関数でその関数を呼び出すと
"呼び出し時のパラメータが足りない"とエラーがでます。
この自作関数のみでコンパイルすると
(windowcaputure → main関数と名前を変更し)
きちんと動作することは確認しています。
以下、ソースを載せています。
原因がわかる方、アドバイスお願いします。
void SaveBitmap(HWND hWnd, LPCTSTR sFileName)
{
HANDLE hFile;
HDC hDc, hDcBuf;
LPBITMAPFILEHEADER lpHead;
LPBITMAPINFOHEADER lpInfo;
LPBYTE lpBuf, lpPixel;
RECT cRect;
HBITMAP hBmp, hOldBmp;
DWORD nWriteSize, nFileSize, nWidth, nHeight, nLength;
GetClientRect(hWnd, &cRect); // 画面サイズの取得 /* クライアント領域取得 */
nWidth = cRect.right; //幅
nHeight = cRect.bottom; //高さ
if(
( nWidth * 3 ) % 4 == 0 ) // ライン長を計算
{
nLength = nWidth * 3;
}
else{
nLength = nWidth * 3 + ( 4 - ( nWidth * 3 ) % 4 );
}
nWidth=518;
nHeight=610;
// ファイルサイズの計算
nFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nLength * nHeight;
// 一時メモリの確保と各種情報のセット
lpBuf = (LPBYTE)GlobalAlloc(GPTR, nFileSize); // バッファの確保
lpHead = (LPBITMAPFILEHEADER)lpBuf; // ファイルヘッダ情報
lpInfo = (LPBITMAPINFOHEADER)(lpBuf + sizeof(BITMAPFILEHEADER));//その他情報
lpPixel = lpBuf + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//ピクセルの取得
// ビットマップ情報のセット
lpHead->bfType = 'M' * 256 + 'B';
lpHead->bfSize = nFileSize;
lpHead->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
lpInfo->biSize = sizeof(BITMAPINFOHEADER);
lpInfo->biHeight = nHeight;
lpInfo->biWidth = nWidth;
lpInfo->biBitCount = 24;
lpInfo->biPlanes = 1;
// DCの取得とBMP情報のセット
hDc = GetDC(hWnd); // DCの取得
hBmp = CreateCompatibleBitmap(hDc, nWidth, nHeight); // ウインドウのデバイスコンテキスト互換のBITMAP作成 */
hDcBuf = CreateCompatibleDC( hDc ); // DC互換のDCバッファを作成
// BMPのコピー
hOldBmp = (HBITMAP)SelectObject( hDcBuf, hBmp ); // 旧BMPの待避
BitBlt( hDcBuf, 0, 0, nWidth=518, nHeight=620, hDc,16,32, SRCCOPY ); // ビットマップのコピー
SelectObject( hDcBuf, hOldBmp ); // 旧BMPの復元
GetDIBits( hDc, hBmp, 0, nHeight, lpPixel, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS );
hFile = CreateFile( sFileName, GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL );
if( hFile != INVALID_HANDLE_VALUE )
{
WriteFile( hFile, lpBuf, nFileSize, &nWriteSize, NULL ); // ファイルへの書き込み
CloseHandle( hFile );
}
ReleaseDC( hWnd, hDc ); // DCの解放
DeleteObject( hBmp );
DeleteObject( hDcBuf );
GlobalFree( lpBuf );
}
BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam)
{
WINDOWINFO wi;
char szWindowName[ 128 ];
double caputuretime;
wi.cbSize = sizeof(WINDOWINFO);
GetWindowInfo(hWnd, &wi);
if (wi.dwStyle & WS_VISIBLE) {
GetClassName( hWnd, szWindowName, sizeof(szWindowName) );
if(strcmp(szWindowName,"ThunderRT6FormDC")==0){
//ウィンドウを前面にして書き直させる
SetForegroundWindow(hWnd);
Sleep(100);
caputuretime = time(NULL);
itoa(caputuretime , yy, 10);/* 10 は十進数変換 */
//キャプチャ習得時間をファイル名に
strcat(yy, ".bmp");
SaveBitmap(hWnd,yy);
}
}
return TRUE;
}
int windowcaputure(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow)
{
EnumWindows(EnumWndProc, 0);/*画面上のすべてのトップレベルウィンドウを列挙*/
return 0;
}
お礼
回答有難うございます。サンプルですか、今まで思いつきませんでしたが探してみることにします。その後自分なりに作成してみたのですがGetDIBits の行でエラーが出てしまいなぜそうなるのかが分かりませんでした。その件は新たに質問で作成させていただきたいと思います。有難うございました。