アプリ版:「スタンプのみでお礼する」機能のリリースについて

LPDIRECTINPUT8m_pDI;
LPDIRECTINPUTDEVICE8m_pJoystick;

省略

// ゲームコントローラーの列挙
if(FAILED(hr = m_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL,
EnumJoysticksCalback, NULL, DIEDFL_ATTACHEDONLY))) return hr;

//********************************************************/

BOOL CALLBACK InputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext )
{
HRESULT hr;

hr = m_pDI->CreateDevice(pdidInstance->guidInstance, &m_pJoystick, NULL);
if(FAILED(hr)){
return DIENUM_CONTINUE;
}else{
return DIENUM_STOP;
}
}

ゲームコントローラーの列挙をするためのコードを msdn や DirectXSDK のサンプルを
参考に書きました。でもどうしても以下のようなエラーがでます。
キャストなど試してみましたが解決にはいたりませんでした。
どうかご教授おねがいします。


d:\○○△△.cpp(30) : error C2664: 'IDirectInput8A::EnumDevices' : 2 番目の引数を 'BOOL (const DIDEVICEINSTANCE *,void *)' から 'LPDIENUMDEVICESCALLBACKA' に変換できません。

A 回答 (1件)

お気持ちよーく分かります。


でもとても不便なことに、コールバック関数に通常のクラスメンバ関数は指定できないのですよ。
ひと工夫必要なんです。

解決策は簡単に言えば2つ

完全なグローバル関数として定義
BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext );

静的なクラスメンバ関数として定義
static BOOL CALLBACK InputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext );

要は暗黙に使われている this ポインタが邪魔なのですよ(厳密に言えばだいぶ違いますけど)。
参考URLにそこらへんを書いてるURLを上げておきます。
まあ、何とかエレガント(笑)にしたいところですけどね。

個人的にはこんな感じ(コンパイル通るかどうかまではやりませんが)でやるかな・・・・


// ゲームコントローラーの列挙(3番目の引数にthisをセット(この部分が class InputDevice のメンバ関数の中なら))
if(FAILED(hr = m_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL,
EnumJoysticksCalback, this, DIEDFL_ATTACHEDONLY))) return hr;

//********************************************************/
// クラスの static 定義の細かい部分は修正してください(たぶん間違ってる??)
static BOOL CALLBACK InputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext )
{
HRESULT hr;
InputDevice* pObj = ( InputDevice* )pContext;// pContext には先の this のアドレスが入っているはず

hr = pObj->m_pDI->CreateDevice(pdidInstance->guidInstance, &pObj->m_pJoystick, NULL); // なのでコレがいける
if(FAILED(hr)){
return DIENUM_CONTINUE;
}else{
return DIENUM_STOP;
}
}


まあ確かにいちいちこんなことを・・・ってのはありますね。
ちなみにコレDirectInputに限らず、コールバック関数をクラス定義するときには必ず付いて回る問題です。

参考URL:http://techtips.belution.com/ja/vc/0009/
    • good
    • 0
この回答へのお礼

エラーは外れました!どうもありがとうございます!
コールバック関数はテキストにも掲載されていないので、全く0からのスタートでした。
だから、最初から苦戦を予想していましたが、
その予想も的中したようです。
でも、おかげでコールバック関数のクラス化の方法が見えました。改めてありがとうございました。

お礼日時:2006/07/28 21:58

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