• 締切済み

コールバック関数とクラスとの間のトラブル

// クラスの定義 class CInputDevice{ private: LPDIRECTINPUT8 m_pDInput; LPDIRECTINPUTDEVICE8 m_pJoystick; public: HRESULT CreateInput(HWND hWnd); // コールバック関数 static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext); }; // メンバ関数 HRESULT CInputDevice::CreateInput(HWND hWnd) { 省 略 // ゲームコントローラーの列挙:コールバック関数呼出 if(FAILED(hr = m_pDInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY))) return hr; 省 略 return S_OK; } // コールバック関数 BOOL CALLBACK CInputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext) { HRESULT hr; CInputDevice* pDevice = (CInputDevice*) pContext; // ▼アヤシイ部分 hr = pDevice->m_pDInput->CreateDevice(pdidInstance->guidInstance, &pDevice->m_pJoystick,NULL); if(FAILED(hr)){ return DIENUM_CONTINUE; }else{ return DIENUM_STOP; } } これは下のURLで質問した時のアドバイスを元に修正したものです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2305038 おかげでコンパイル時はエラーは出なくなりましたが。。。 実行時メモリに関する警告メッセージが出るようになりました。 そしてデバッガで調べたところ、コールバック関数内で、 どうやらメンバ関数からの値が完全に行き渡っていないようです。 そういえば、 >要は暗黙に使われている this ポインタが邪魔なのですよ と一言書いてあったのですが、これが解決の鍵を持っているのではないかと 思います。試してみましたが返ってエラーが多発するだけで現在STOP状態です。 どうか、ご教授ください。おねがいします!

みんなの回答

  • aho0xff
  • ベストアンサー率12% (218/1771)
回答No.1

呼ばれた気がしたので、登場してみました。 ぱっと見ただけで物いいますが、 // ゲームコントローラーの列挙:コールバック関数呼出 if(FAILED(hr = m_pDInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY))) return hr; ここ、何故第3引数 NULL ですか?ココに値渡さないと、 // コールバック関数 BOOL CALLBACK CInputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext) コレの pContext は NULL のままですよ?それのアドレスを使ってはまずいですよね?? コレで解決しないなら、ちょっと根が深そうではありますが・・・・・

nVIDIA
質問者

お礼

偶然私の同じような事をオブジェクト指向で行っているころのHPを発見し 参考に第二引数を NULL から (void*)this のように変更してみました。 そしたらどうやらデータがコールバック関数まで行く渡ったようでメモリ警告が出なくなりました。 メモリ関数にはthisという隠れた引数を持っているので クラス定義でstaticを入れるコールバック関数はこのstaticでthisが消えてしまう事までは知っていましたが… 詳しいことはまだわかりません。そのことについては次の質問で聞こうと思います。 どうもご教授ありがとうございました。

nVIDIA
質問者

補足

これは msdn と DirectSDK のサンプルを参考に書きました。 msdn のチュートリアルでは第三引数をNULLにするように指示されていました。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/input/tuts/tut3/step1enumeratingjoysticks.asp また、DirectSDKにあるサンプルにも同じようになっていたのであえてNULLにしたのです。 ちょっと見てみてください。

関連するQ&A