游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1779|回复: 6

新手求救,紧急

[复制链接]

1

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2006-4-20 14:49:00 | 显示全部楼层 |阅读模式
我按照DirectX9.0SDK实例中的Joystick例子写一个控制杆的类,
可是在函数EnumJoysticksCallback中,出现错误:
函数:
BOOL CALLBACK MyJoyStick::EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance,
                                     VOID* pContext )
{
    HRESULT hr;
    hr = MyJoyStick::g_pDI->CreateDevice( pdidInstance->guidInstance, &MyJoyStick::g_pJoystick, NULL );
    if( FAILED(hr) )
        return DIENUM_CONTINUE;
    return DIENUM_STOP;
}
错误:

error C2227: left of '->CreateDevice' must point to class/struct/union
Error executing cl.exe.
类声明中有如下定义
LPDIRECTINPUT8       g_pDI        ;         
LPDIRECTINPUTDEVICE8 g_pJoystick  ;
我已经添加了一下动态链接库:dxguid.lib dxerr9.lib dinput8.lib
求助各位大侠,谢谢

12

主题

124

帖子

124

积分

注册会员

Rank: 2

积分
124
QQ
发表于 2006-4-20 17:25:00 | 显示全部楼层

Re:新手求救,紧急

把 MyJoyStick::g_pDI 用括号括起来看看。

另外,你刚开始说用的DX9.0SDK,可程序中明明用的 8.0 的接口,还有,既然是类的成员变量,变量名前缀居然用 g_ ,你的编码风格还真是别致啊。

1

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2006-4-20 18:00:00 | 显示全部楼层

Re: 新手求救,紧急

我加了括号,还是不行。
例子确实是DirectX9.0SDK实例中的,就连变量名也是那里面的。
呵呵,不好意思,见笑了。
十分感谢,还会有别的原因吗?

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2006-4-21 00:16:00 | 显示全部楼层

Re:新手求救,紧急

SDK里g_pDI前是没有MyJoyStick的,你自己把他封装进了类是不是定义的时候定义错了,你好好检查一下,原sdk里的是DIRECTINPUT8的指针.还有,封装进了类最好把全局变量的g_前缀改成m_前缀,这样好些,需要类里的全局性质用static关键字.

12

主题

124

帖子

124

积分

注册会员

Rank: 2

积分
124
QQ
发表于 2006-4-21 13:13:00 | 显示全部楼层

Re:新手求救,紧急

你既然封装到自己的类里面了,你把 MyJoyStick::g_pDI 前面的 MyJoyStick 去掉看看,或者用 this->g_pDI,你的 g_pDI应该不是静态变量吧。

1

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2006-4-21 17:49:00 | 显示全部楼层

Re:新手求救,紧急

我照大家的意见修改了一下。这是定义
我照大家的意见修改了一下。这是定义
    LPDIRECTINPUT8       m_pDI ;         
    LPDIRECTINPUTDEVICE8 m_pJoystick  ;

我知道那个错误(error C2227)的原因了,因为静态成员函数无法直接访问非静态数据成员,要通过参数传递才可以。但是EnumJoysticksCallback这个函数是回调函数,我修改它的参数会出错。要是不定义成静态的函数,就会出现另一个错误。
MyJoystick.h文件中的定义:
    LPDIRECTINPUT8       m_pDI ;         
    LPDIRECTINPUTDEVICE8 m_pJoystick  ;
BOOL CALLBACK EnumJoysticksCallback(const  DIDEVICEINSTANCE* pdidInstance, VOID* pContext ) ;
HRESULT InitDirectInput( HWND hWnd );
这样在初始化时,这条语句会出错(函数InitDirectInput中),

if( FAILED( hr = m_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,
                                         EnumJoysticksCallback,
                                         NULL, DIEDFL_ATTACHEDONLY ) ) )
        return hr;
其中hr的定义:HRESULT hr;
会出现错误:
error C2664: 'EnumDevices' : cannot convert parameter 2 from 'int (const struct DIDEVICEINSTANCEA *,void *)' to 'int (__stdcall *)(const struct DIDEVICEINSTANCEA *,void *)'
我看过我们论坛上的一个帖子,说回调函数最好不要写在类中,但是我很困惑,如果放在类外面,又需要传参数,而它是一个回调函数;要是写成静态的成员函数,就不能使用非静态数据成员。
刚学游戏编程,对回调函数很陌生,请教大家,谢谢,不胜感激。

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2006-4-21 19:20:00 | 显示全部楼层

Re:新手求救,紧急

那个帖子还说了thunk啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 07:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表