こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

// クラスの定義
class CInputDevice{
private:
LPDIRECTINPUT8m_pDInput;
LPDIRECTINPUTDEVICE8m_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状態です。
どうか、ご教授ください。おねがいします!

投稿日時 - 2006-07-31 14:09:47

QNo.2310776

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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 のままですよ?それのアドレスを使ってはまずいですよね??
コレで解決しないなら、ちょっと根が深そうではありますが・・・・・

投稿日時 - 2006-07-31 19:00:35

補足

これは 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にしたのです。

ちょっと見てみてください。

投稿日時 - 2006-07-31 21:53:10

お礼

偶然私の同じような事をオブジェクト指向で行っているころのHPを発見し
参考に第二引数を
NULL
から
(void*)this
のように変更してみました。

そしたらどうやらデータがコールバック関数まで行く渡ったようでメモリ警告が出なくなりました。
メモリ関数にはthisという隠れた引数を持っているので
クラス定義でstaticを入れるコールバック関数はこのstaticでthisが消えてしまう事までは知っていましたが…
詳しいことはまだわかりません。そのことについては次の質問で聞こうと思います。
どうもご教授ありがとうございました。

投稿日時 - 2006-07-31 23:27:50

あなたにオススメの質問