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' に変換できません。
No.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/
エラーは外れました!どうもありがとうございます!
コールバック関数はテキストにも掲載されていないので、全く0からのスタートでした。
だから、最初から苦戦を予想していましたが、
その予想も的中したようです。
でも、おかげでコールバック関数のクラス化の方法が見えました。改めてありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
ArduinoでMouse関数を使用して...
-
H8 3664Fのプログラム
-
多重定義が起きている?--lnk20...
-
C/C++でのScene管理について
-
stddef.hって何?
-
VC++でGetKeyboardStateがうま...
-
Notepad++の関数リスト表示の変...
-
_beginthread()の使用について
-
静的でないメンバ関数の呼び出...
-
クラス間でのクラスの共有?
-
SC_SIZEがわからない
-
pictureboxの画像を削除するには?
-
string型とsbyte*型の変換
-
マルチメディアタイマーの使用方法
-
Delphiの定数とローカル変数の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
静的でないメンバ関数の呼び出...
-
gcc: incompatible pointer type
-
C# Controls.Addで動的に配置し...
-
int main()、void main()、void...
-
(void)0 はどんな意味ですか
-
VC++でGetKeyboardStateがうま...
-
void*型の配列について
-
C# KeyDownイベントでショート...
-
const_castのつかいどころを教...
-
H8マイコンのシリアル通信につ...
-
コールバックって・・・
-
関数ポインタについて
-
void main()って誰が最初?:AN...
おすすめ情報