繁体   English   中英

创建对象时应用程序崩溃

[英]Application crashes when creating an object

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

此处: http//pastebin.com/QuHP02ai

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

ps直接输入v。7

pps

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

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

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

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 这是非常有帮助的书。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM