创建对象时应用程序崩溃

时间:2010-11-08 12:02:43

标签: c++ inheritance input crash directx

我有一个继承自IDirectInputA接口的类。

此处:http://pastebin.com/QuHP02ai

所以,当我尝试创建此对象时,应用程序崩溃(从某处调用CorExitProcess)。我做错了什么?

P.S。直接输入v.7

p.p.s。

此代码创建对象。我删除了一些代码,除了主要部分

IDirectInputA** ppDI;
HRESULT hr = _DirectInputCreateA(hinst, dwVersion, ppDI, punkOuter);
xDirectInputA xDI = new xDirectInputA((IDirectInputA*)(*ppDI));

2 个答案:

答案 0 :(得分:0)

创建实例时,将指针传递给IDirectInputA,对吧?你通过什么指针?如果传递未初始化或空指针,则会得到未定义的行为。

答案 1 :(得分:0)

TBH你想要做的事情比你想象的要复杂得多。问题出在你究竟想要做什么。您是否尝试包装IDirectInputA或者您是否正在尝试完全重新实现它。

如果您尝试包装它,请执行以下操作:

IDirectInputA* pDI = NULL;
HRESULT hr = _DirectInputCreateA( hinst, dwVersion, &pDI, NULL );

然后按如下方式创建派生类:

class xDirectInputA : public IDirectInputA
{
protected:
    IDirectInputA* mpInternal;
public:
    xDirectInputA( IDirectInputA* pInternal ) :
         mpInternal( pInternal )

    HRESULT CreateDevice( REFGUID rguid, IDirectInputDevice** ppDirectInputDevice, IUknown* pOuter )
    {
        // Do what ever processing you need.
        return mpInternal->CreateDevice( rguid, ppDirectInputDevice, pOuter );
    }

    // Implement other functions.
};

现在您传递xDirectInputA指针而不是从DirectInputCreate返回的普通指针。您现在可以拦截通过该类的每条消息。

如果你正在尝试自己完全重新实现它,那就更复杂了。您将需要完全实现COM对象。您最好将DInput.DLL与包含您的实现的可执行文件放在一起。尽管如此,如果你真的知道自己在做什么,这只是你应该尝试的事情。

如果您想完全学习COM,我建议您购买Don Box的Essential COM。这是一本非常有用的书。