トップページ > 過去ログ > 記事閲覧
フック関数でエラー
名前:とかげ 日時: 2007/10/11 20:34

はじめまして。 フック関数がうまく使えません。フック関数を使った、以下のソースコードをコンパイルするとエラー 『1 番目の引数を 'WNDPROC (__cdecl *)(HWND,UINT,WPARAM,LPARAM)' から 'WNDPROC' に変換できません。』 が発生します。 また、引数"HookWinMessage"を無理やり"WNDPROC"にキャストして、実行すると『ハンドルされていない例外』が 出て上手く動きません。 分かる方がいらっしゃるなら、ご教示願います。 //----------WinBase.h----------// #ifndef _WINBASE_H_ #define _WINBASE_H_ #include <DxLib.h> class WinBase{ protected: static WNDPROC HookWinMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); public: WinBase(bool window_mode); ~WinBase(); }; #endif //----------WinBase.cpp----------// #include "WinBase.h" WinBase::WinBase(bool window_mode){ //コンストラクタ ChangeWindowMode(window_mode); DxLib_Init() SetHookWinProc(HookWinMessage); //←ココでプロシージャ登録 } WinBase::~WinBase(){ //デストラクタ DxLib_End(); } WNDPROC WinBase::HookWinMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg){ case WM_KEYDOWN: //Escキーで終了 if(wParam == VK_ESCAPE) DestroyWindow(hWnd); break; case WM_DESTROY: //ウインドウが破棄された PostQuitMessage(0); break; } return 0; } //----------WinMain.cpp----------// #include "WinBase.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ WinBase *Win = new WinBase(true); DrawPixel(320, 240 ,0xffff); // 点を打つ WaitKey(); // キー入力待ち delete Win; return 0 ; }

Page: 1 |

Re: フック関数でエラー ( No.1 )
名前:憂煉 日時:2007/10/12 00:12

WNDPROC型は関数ポインタであり、 LRESULT __stdcall DefWindowProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); のような関数が登録できます。したがって、 WNDPROC WinBase::HookWinMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ↓ LRESULT __stdcall WinBase::HookWinMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) のようにすればうまくいくはずです。
Re: フック関数でエラー ( No.2 )
名前:憂煉 日時:2007/10/12 00:16

補足。 DxLib_Init関数にセミコロンが無いようなので追加しませう。 また、色の指定を数値で直接していますが、モニタの色数によってはエラーになるのでなるべくGetColor関数を使うといいです。勝手に補正してくれますです。
Re: フック関数でエラー ( No.3 )
名前:とかげ 日時:2007/10/12 19:22

憂煉さんありがとうございます! おかげ様で動きました。 "__stdcall"は、API関数を呼び出すときのお約束、と理解しておけば良いのでしょうか? "WINAPI"というマクロとして定義されていますし。
Re: フック関数でエラー ( No.4 )
名前:憂煉 日時:2007/10/12 23:20

__stdcallは関数の呼び出し規約の一種です。関数の呼び出し規約には何種類かありまして、高速なものやら安全なものやらそれぞれに特徴があります。 以下に__stdcallの主な特徴を挙げますね。  @引数の渡しかたはスタック経由のみ。CPUレジスタは使わない。  Aスタックへの積み方は一般的な呼び出しと同じ。  Bスタックに積まれた引数の後始末は関数が呼び出された側で行なう  C関数は引数の正確な数と型を渡す必要がある これくらいですかね? 確かに、ほとんどのWinAPI関数はこれを使っていますがその理由は「システムに干渉できるAPIも多く存在するために、引数を渡す際に必ず正確な型と数を渡してもらうため」です。先ほど挙げた特徴のCが該当します。 他にも深い事情があるらしいですがその辺はMicrosoftやIntelのおじさんたちにでも聞いてみてください。 というわけで、自作の関数を宣言するときにも普通に使えます。 なお、これは関数の宣言時にだけ使えば良いので呼び出し時に使う必要はないです。(むしろ、コンパイルエラーになるかもしれません) 長くなってしまってわかりにくかったらすいませんです。
Re: フック関数でエラー ( No.5 )
名前:投槍 日時:2007/10/14 11:39

分かりやすい説明、ありがとうございます。 普段、普通に呼び出している関数にも、デフォルトで呼び出し規約がついているようですね。 そんなものがあるなんて、全く知りませんでした。

Page: 1 |