• ベストアンサー

SDKでのエラーなのですが。

はじめまして。 SDKの勉強で猫でもわかる~のHPの第37章のサンプルを実行したのですが、 --------------------構成: 037 - Win32 Debug-------------------- コンパイル中... main.cpp D:\SDK\037\main.cpp(230) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 D:\SDK\037\main.cpp(248) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 cl.exe の実行エラー 037.exe - エラー 2、警告 0 というようなエラーが出てしまいました。 このエラーを回避するにはどのようにすればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • uzk
  • ベストアンサー率40% (6/15)
回答No.1

CallWindowProcに渡されているものをみるとFARPROCで宣言されていますが、正確にはWNDPROCを渡す必要があります。なので、最初のグローバル変数宣言の所の型を変えて、代入部分のキャストもWNDPROCに変えましょう。 あの文が書かれた頃の古いVC++ではそれでもエラーが出なかったんでしょうが、最近はチェックが厳しくなってます。 ちなみにFARPROCとWNDPROCは、void*とint*の関係みたいなものです。void*は何かのポインタで、int*はintのポインタだから、void*にint*は入れられます。でもその逆は、void*が何のポインタか分からないので、エラーや警告が出ます。(C++でなくC(*.c)だともっと甘いかも。)

123456zennsinn
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 WNDPROCでキャストすればよかったのですか… 私はずっとFARPROCでキャストして、出来ず質問させていただいていました。 解説とともに回答ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

ANo.1さんのとおり、Org_EWnd1の型をWNDPROCにすればいいような。。。

すると、全ての回答が全文表示されます。
noname#9119
noname#9119
回答No.3

質問のはGetStockObject()はエラーになっていませんでしたね。 VisualC++6.0で第37章をコンパイルしたらエラーになったので書いてしまいました。

すると、全ての回答が全文表示されます。
noname#9119
noname#9119
回答No.2

エラーの通りにキャストしてやるといいです。 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); こんな感じに。 FARPROCではなくWNDPROCを使うのは http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_callwindowproc.asp ヘルプを読んでください。 コンパイラはVisualC++のようですがバージョンはいくつでしょうか? 「猫でもわかるプログラミング」のサイトに「VC++6.0でうまくビルドできない時は」などのページがあります。(それらのページを見てもこの場合の答えは載っていませんが。) 50章以降はエラーの出ないようにキャストしているということなので、50章以降の記述を参考にするといいでしょう。

すると、全ての回答が全文表示されます。