自作関数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;
}
No.2ベストアンサー
- 回答日時:
# もしかしてC言語を学習し始めたばかりの方でしょうか
> プロトタイプに関しては試してみたのですが
> 原因ではないようです。
(中略:windowcaputureをmainに置換したもの)
> にすると、正常に動作します。
プロトタイプの意味を取り違えているか、例示されているものが変です。
プロトタイプと書いたのは関数プロトタイプまたは関数宣言と呼ばれるもので、その関数の戻り値の型と引数の型をあらかじめコンパイラに教えるためのものです。
このwindowcaputure関数の場合は以下のようになります。
int windowcaputure(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow);
これを、関数呼び出し前(一般的にはヘッダファイルかソースのinclude文などのすぐあと)に書いておきます。
一応、(C++ではない)C言語では関数呼び出し前に関数定義(関数本体)があれば不要となっていますが、引数や戻り値の型チェックなどが出来るため、書いた方が良い(または、書くべきである)とされています。
書かない場合、戻り値の型はint、引数はソース中で一番最初に呼び出されたときの引数の型が正しいものと仮定されます。
ただ、前回回答の返事を見ると
> 他の関数内で
> windowcaputure();
> のようにして呼び出しています。
とありますが、もしかして引数なしで呼び出そうとしているのでしょうか?
その場合、プロトタイプがあるならパラメータのエラーが出て当然です。
コンパイラに対してwindowcaputure関数は戻り値int、引数として HINSTANCE, HINSTANCE, PSTR, int の4つを取りますよ、と宣言しているのに何もないのですから。
無い場合は記述位置によって色々変わってきそうですけど、関数定義後に呼び出されていれば同様になります。
関数定義前の呼び出しの場合だと、無いはずの引数があって一致していない、と言うようなエラーか、または関数が見つからないというエラーが出ると思います。
で、不要な引数ですが…全部です。
関数内でどの引数も使われていません。
この内容ならば、
int windowcaputure(void)
で十分です。
プロトタイプ宣言のことですよね。
(実際にはwindowcaputure関数を含んだヘッダーファイルを作り
順番にコンパイルされるようにしています。)
ただ、最初の回答時に試したプロトタイプ宣言は
int windowcaputure();
のようにしてだめでしたが、
int windowcaputure(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow);
のようにすると、コンパイルされました。
>で、不要な引数ですが…全部です。
>関数内でどの引数も使われていません。
>この内容ならば、int windowcaputure(void)で十分です。
ありがとうございます。
Cを初めて数か月も経つのですが、恥ずかしい限りです。。。
No.1
- 回答日時:
windowcaputureを呼んでいるところがないのでわからないですが、
単純に呼び出し時の引数が足りていないか、プロトタイプがなくておかしくなっているかのどちらか、または両者の複合のような気がします。
ところで素朴な疑問ですがwindowcaputureはなぜこんなに不要な引数があるんでしょう?拡張予定で確保だけしているのでしょうか。
ご回答ありがとうございます。
プロトタイプに関しては試してみたのですが
原因ではないようです。
int main (HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow)
{
EnumWindows(EnumWndProc, 0);/*画面上のすべてのトップレベルウィンドウを列挙*/
return 0;
}
にすると、正常に動作します。
呼び出すときは、特に変わったことはせずに
他の関数内で
windowcaputure();
のようにして呼び出しています。
>windowcaputureはなぜこんなに不要な引数があるんでしょう?拡張予>定で確保だけしているのでしょうか。
ですが、正直、自分ではどれが不要であるのかわかりませんので
教えていただければ、改善しようと思います。
お願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?賛成だったら「賛」、否定だったら「否」を文頭においてあなたの意見を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
パラメータが不足しています と表示されたのですが、どういう意味でしょう
Windows Vista・XP
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
typedef enumの使い方を教えて...
-
long型の定数の末尾にLを付ける...
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
2重定義って??
-
プログラムの中で別のmainを呼...
-
enumについて
-
【#define】 defineで定義した...
-
構造体を引数とする、クラス間...
-
C言語のコンパイルエラー
-
コンパイルすると error C1083 ...
-
構造体の宣言でエラーが出ます。
-
配列を用いない最大値の求め方
-
スレッドのスケジューリングポ...
-
C++でのDLL利用について
-
相互参照するクラス、俺こんな...
-
main()とint main(void)の違い
-
C言語での方向キー入力判定
-
コンパイルエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
関数の実体定義にヘッダファイ...
-
main.c:7:43: warning: implici...
-
構造体の要素すべてに対する四...
-
変数の型を定義しなかった場合...
-
void func( void )について
-
【#define】 defineで定義した...
-
VC6でlong longでエラー?
-
0除算を判定したい
-
プログラムの中で別のmainを呼...
-
C言語のコンパイルエラー
-
構造体の宣言でエラーが出ます。
-
intとINTの違いは?
-
DLLでLIBファイルが作成されない
おすすめ情報