我有一个继承自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));
答案 0 :(得分:0)
创建实例时,将指针传递给IDirectInputA,对吧?你通过什么指针?如果传递未初始化或空指针,则会得到未定义的行为。
答案 1 :(得分:0)
如果您尝试包装它,请执行以下操作:
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。这是一本非常有用的书。