ちょっと先の未来クイズ第1問

 EnumWindows( EnumWndProc,(LPARAM) NULL);

この記述の行で下記のエラーが出ます。
宣言は BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam); としてあります。

error C2664: 'EnumWindows' : 1 番目の引数を 'int (struct HWND__ *,long)' から 'int (__stdcall *)(struct HWND__ *,long)' に変換できません。 (新しい機能 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。

キャストすればよいのかと思い下行のようにしました。
 EnumWindows((__stdcall *) EnumWndProc,(LPARAM) this);

そうすると次のエラーになります。
error C2059: 構文エラー : '__stdcall'

このエラーを回避するにはどうしたらよろしいのでしょうか。

皆様ののお知恵を拝借させてください。
よろしくお願いいたします。

A 回答 (1件)

EnumWindowsを呼び出す前に



BOOL EnumWindows(WNDENUMPROC lpEnumFunc , LPARAM lParam);

と言うプロトタイプ宣言が必要です。

このプロトタイプ宣言をし忘れると、EnumWindowsの第一引数の関数の呼び出し規則が__stdcallとなり、宣言と一致しなくなります。

>キャストすればよいのかと思い下行のようにしました。

キャストは駄目です。呼び出し規則は変更出来ません。

呼び出し規則を無理矢理にキャストしてしまうと、呼び出し元と呼ばれた関数の整合性が取れなくなり、暴走したり、メモリリークしたり、致命的例外を発生したりしますので、通常はキャストできないようになっています。

この回答への補足

早速の回答ありがとうございます。

試してみたのですが、下記のエラーになってしまいます。

error C2373: 'EnumWindows' : 再定義されています。異なる型修飾子です。
c:\program files\microsoft visual studio\vc98\include\winuser.h(6748) : 'EnumWindows' の宣言を確認してください。

何か他にご回答またはヒントがありましたらよろしくお願いいたします。

補足日時:2014/09/19 13:33
    • good
    • 0
この回答へのお礼

その後、別なソースファイルに入れたところエラーが無くなりましたのでとりあえずそちらで対処することにしました。

どうもありがとうございました。

お礼日時:2014/09/19 14:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!